4

我有两张桌子:

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

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

4

2 回答 2

2

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

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

编辑:这是您的解释(简化):

+----+-------------+-------------+--------+----------------------+------+
| 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 表(500 万行)上有一个“ALL”扫描

你可能想看看这里:http ://hackmysql.com/case4

于 2013-07-25T13:06:13.750 回答
1

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

于 2013-07-25T13:11:39.783 回答