为啥 MySQL 在使用 JOIN 而不是 WHERE 时很慢?
Posted
技术标签:
【中文标题】为啥 MySQL 在使用 JOIN 而不是 WHERE 时很慢?【英文标题】:Why MySQL is very slow when using JOIN instead of WHERE?为什么 MySQL 在使用 JOIN 而不是 WHERE 时很慢? 【发布时间】:2013-07-25 09:21:49 【问题描述】:我有两张桌子:
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')
为什么第一个查询需要这么长时间?
【问题讨论】:
如果你尝试SELECT test_sample.* FROM ...
你的第一个查询呢?
在两个查询上运行EXPLAIN。
第二张表是否有好的索引?
两个表都有索引
【参考方案1】:
您是否尝试查看执行路径? 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
【讨论】:
那么,是否可以在 MySQL 中使用不查看整个表而只查看特定 ID 的 JOIN?【参考方案2】:第一次查询将花费更多时间,因为它会检查另一个表的每一行是否有 500 万条记录。另一方面,第二个 sql 有一定的索引列。 希望它会帮助你。
【讨论】:
以上是关于为啥 MySQL 在使用 JOIN 而不是 WHERE 时很慢?的主要内容,如果未能解决你的问题,请参考以下文章
即使使用 INNER JOIN 而不是 IN,MySQL 查询也非常慢
为啥在 PHP 中使用 PDO 而不是 MySQL? [复制]