使用JOIN而不是WHERE时为什么MySQL非常慢?

时间:2013-07-25 13:00:19

标签: mysql performance join where

我有两张桌子:

CREATE TABLE `test_sample` (
  `idtest_sample` varchar(50) NOT NULL,
  `test_samplecol` varchar(45) DEFAULT NULL,
  UNIQUE KEY `idtest_sample_UNIQUE` (`idtest_sample`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

CREATE TABLE `new_table` (
  `idnew_table` int(11) NOT NULL,
  UNIQUE KEY `idnew_table_UNIQUE` (`idnew_table`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

第一个表包含500万条记录,而第二个表只包含10条记录。

执行此查询的持续时间超过5秒:

SELECT * FROM test_sample 
INNER JOIN new_table 
ON test_sample.idtest_sample = new_table.idnew_table

此查询立即执行(少于0.001秒):

SELECT * FROM test_sample 
WHERE test_sample.idtest_sample IN 
('3','1597','25963','170596','196485',
'545963','999999','1265896','1569485','1999999')

为什么第一个查询需要这么长时间?

2 个答案:

答案 0 :(得分:2)

您是否尝试过查看执行路径? DESC {SQL},你的第一个肯定更长

第一个查询肯定会查看另一个表的每一行的整个5百万行。 虽然您的第二个查询只查找具有索引的特定ID(因为它们是主键的一部分)

编辑: 这是你的EXPLAIN(简化):

+----+-------------+-------------+--------+----------------------+------+
| id | select_type | table       | type   | possible_keys        | key  |
+----+-------------+-------------+--------+----------------------+------+
|  1 | SIMPLE      | new_table   | system | idnew_table_UNIQUE   | NULL |
|  1 | SIMPLE      | test_sample | ALL    | idtest_sample_UNIQUE | NULL |
+----+-------------+-------------+--------+----------------------+------+
+----+-------------+-------------+-------+----------------------+----------------------+
| id | select_type | table       | type  | possible_keys        | key                  |
+----+-------------+-------------+-------+----------------------+----------------------+
|  1 | SIMPLE      | test_sample | const | idtest_sample_UNIQUE | idtest_sample_UNIQUE |
+----+-------------+-------------+-------+----------------------+----------------------+

正如您所看到的,test_sample表上有一个'ALL'扫描(5百万行)

您可以在此处查看:http://hackmysql.com/case4

答案 1 :(得分:1)

第一次查询将花费更多时间,因为它会检查另一个表的每一行是否有5百万条记录。另一方面,第二个sql有一定的索引列。 希望它会对你有所帮助。