为什么mysql内连接查询花了这么多时间

时间:2009-12-15 06:19:30

标签: java mysql database

在mysql中我有两个表

TABLEA

col1   col2  SIM1 ..........col24
-----------------------------------
a       x     1             5 
b       y     1             3
c       z     0             2
d       g     2             1

tableB的

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。请建议。

3 个答案:

答案 0 :(得分:3)

我的猜测是TableA.SIM1TableB.SIM2中的一个或两个都没有编入索引。或者它们是不同的数据类型(例如VARCHARNUMERIC)。尝试:

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);