首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么使用子查询这个简单的联接查询要快得多呢?

为什么使用子查询这个简单的联接查询要快得多呢?
EN

Stack Overflow用户
提问于 2017-07-28 13:30:07
回答 1查看 189关注 0票数 8

我有两张桌子。order_details是100,000行,outbound是10,000行。

我需要在一个名为order_number的列中加入它们,这是两者的VARCHAR(50)。order_number在出站表中并不是唯一的。

代码语言:javascript
复制
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秒:

代码语言:javascript
复制
SELECT o.order_number
FROM outbound o
INNER JOIN order_details od
    ON o.order_number = od.order_number

此查询获得相同的结果,运行时间不到一秒钟:

代码语言:javascript
复制
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。

总结如下:

为什么使用子查询时这个简单的联接查询速度要快得多?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-28 13:42:48

我对MySQL的了解非常有限。但以下是我的想法:

您的表没有索引。然后,联接必须读取整个第二个表,以便对第一个表的每一行进行比较。

子查询只读取第二个表一次并创建一个索引,然后不需要为第一个表的每一行读取整个第二个表。它只需要检查索引,这就更快了。

要验证我是否正确,请尝试在两个表( creating . )中为列order_number创建索引,然后再次运行这两个查询。您的第一个查询应该只需不到一秒钟,而不是一分钟。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45374832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档