col1 col2 SIM1 ..........col24
-----------------------------------
a x 1 5
b y 1 3
c z 0 2
d g 2 1
colA colB SIM2
-------------------
x g 1
y f 0
x s 0
y e 2
实际上两张表中的记录数量为0.4万
我有一个java程序,我正在使用jdbc执行sql查询。
这是查询
SELECT *
FROM TableA
INNER JOIN TableB ON TableA.SIM1 = TableB.SIM2
INTO OUTFILE 'c:/test12226.csv' "+
FIELDS TERMINATED BY ','
ENCLOSED BY '\"'
LINES TERMINATED BY '\n'
此查询需要很长时间。为了使我的应用程序可行,这不应超过30秒。我知道记录是0.4百万,但这种ms访问操作只需不到10秒。是java-mysql组合比ms-access
更耗时我在调试配置中分配了1GB ram。请建议。
答案 0 :(得分:3)
我的猜测是TableA.SIM1
和TableB.SIM2
中的一个或两个都没有编入索引。或者它们是不同的数据类型(例如VARCHAR
和NUMERIC
)。尝试:
CREATE INDEX index_name1 ON TableA (SIM1);
CREATE INDEX index_name2 ON TableB (SIM2);
没有索引,查询会非常慢。一个表将按记录逐个访问,这很好,因为您输出的是整个表。要在另一个表中查找相应的记录,需要根据SIM1 = SIM2
关系查找。
要在没有索引的情况下查找其他表中的记录,必须查看每条记录。这是线性或O(n)查找。在每张表中放置50万条记录,这是查找所有匹配所需的大量比较(事实数十亿)。
使用索引,记录匹配几乎是即时的。
以这种方式思考:索引列就像按字母顺序放置电话簿。这使得查找姓氏变得容易。如果电话簿根本没有排序需要多长时间才能找到某人的电话号码?
现在乘以50万。
答案 1 :(得分:0)
您是否在TableA.SIM1和TableB.SIM2上设置了索引?
答案 2 :(得分:0)
在两个包含10000行的表之间执行内部联接时。它必须经过10000 * 10000行(如果列未编入索引)。如果您希望它们快,则必须索引TableA.SIM1和TableB.SIM2。这将缩短查询执行时间。
索引使用以下命令
create index on TableA (SIM1);
create index on TableB (SIM2);