为啥 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 查询也非常慢

为啥在字符串连接上使用 os.path.join?

为啥在 PHP 中使用 PDO 而不是 MySQL? [复制]

在 MYSQL 中执行 LEFT OUTER JOIN 时插入零而不是 NULL

为啥 MySQL 不使用我的索引进行 JOIN?

为啥 Mysql JOIN Query - Full SCAN 不使用索引