我有两张桌子。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)这让我感到惊讶,因为通常子查询要慢得多。
运行EXPLAIN (我还在学习如何理解)显示子查询版本使用derived2表,它使用的是索引,该索引是auto_key0。我不够聪明,不知道如何解释这一点,以理解为什么这会产生重大影响。
我正在命令行上运行这些查询。
我正在为Linux (x86_64) CentOS运行Linux14.14远程5.6.35的CentOS。
总结如下:
为什么使用子查询时这个简单的联接查询速度要快得多?
发布于 2017-07-28 13:42:48
我对MySQL的了解非常有限。但以下是我的想法:
您的表没有索引。然后,联接必须读取整个第二个表,以便对第一个表的每一行进行比较。
子查询只读取第二个表一次并创建一个索引,然后不需要为第一个表的每一行读取整个第二个表。它只需要检查索引,这就更快了。
要验证我是否正确,请尝试在两个表( creating . )中为列order_number创建索引,然后再次运行这两个查询。您的第一个查询应该只需不到一秒钟,而不是一分钟。
https://stackoverflow.com/questions/45374832
复制相似问题