我有两张桌子:
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')
为什么第一个查询需要这么长时间?
答案 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有一定的索引列。 希望它会对你有所帮助。