[英]why does mysql inner join query take so much time
在MySQL中,我有两个表
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
实际上两个表中的记录数为40万
我有一个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秒。 我了解记录是40万,但这样的ms访问操作只需不到10秒。 java-mysql组合比ms-access更耗时吗
我在调试配置中分配了1GB内存。 请提出建议。
我的猜测是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万条记录,要查找所有匹配项,实际上需要进行大量比较(实际上是10亿条)。
使用索引,记录匹配几乎是即时的。
这样想:对列进行索引就像按字母顺序放置电话簿。 这样就很容易找到姓氏。 如果电话簿根本没有排序,那么您要花多长时间才能找到某人的电话号码?
现在乘以一百万。
在TableA.SIM1和TableB.SIM2上是否设置了索引?
在两个包含10000行的表之间执行内部联接时。 它必须经过10000 * 10000行(如果未对列进行索引)。 如果希望它们速度很快,则必须索引TableA.SIM1和TableB.SIM2。 这将减少查询的执行时间。
要编制索引,请使用以下命令
create index on TableA (SIM1);
create index on TableB (SIM2);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.