我有两张桌子。order_details
这是 100,000 行,并且outbound
即 10,000 行。
我需要加入他们的专栏order_number
,两者都是 VARCHAR(50)。 order_number 在出站表中不唯一。
CREATE TABLE `outbound` (
`outbound_id` int(12) NOT NULL,
`order_number` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `order_details` (
`order_details_id` int(12) NOT NULL,
`order_number` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
这是我的初始查询,运行时间远远超过 60 秒:
SELECT o.order_number
FROM outbound o
INNER JOIN order_details od
ON o.order_number = od.order_number
此查询获得相同的结果,并且运行时间不到一秒:
SELECT o.order_number
FROM outbound o
INNER JOIN
(
SELECT order_number
FROM order_details
) od
ON (o.order_number = od.order_number)
这让我感到惊讶,因为通常子查询要慢得多。
Running EXPLAIN
(我仍在学习如何理解)表明子查询版本使用derived2
表,它正在使用索引,并且该索引是auto_key0
。我不够精明,不知道如何解释这一点,以理解为什么这会产生重大影响。
我正在通过命令行运行这些查询。
我正在运行 MySQL Ver 14.14 Distrib 5.6.35,适用于 Linux (x86_64) CentOS。
总之:
为什么这个简单的连接查询使用子查询会明显更快?
我对 MySQL 的了解非常有限。但这些是我的想法:
您的表没有索引。
然后,连接必须读取整个第二个表才能比较第一个表的每一行。
子查询读取第二个表一次并创建索引,然后它不需要为第一个表的每一行读取整个第二个表。它只需要检查索引,这要快得多。
要验证我是否正确,请尝试在两个表中为 order_number 列创建索引(CREATE INDEX ...),然后再次运行这两个查询。您的第一个查询应该只需要不到一秒而不是一分钟。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)