回答

收藏

为什么这种简单的连接查询比子查询更快?

技术问答 技术问答 193 人阅读 | 0 人回复 | 2023-09-14

我有两张表。order_details这是100,000行,outbound也就是1万行。
- Q, y6 q0 [) Q我需要把它们加到一个名字列中order_number,这两列都是VARCHAR(50)。order_number不是出站表中唯一的。
( e4 s7 i. Q9 J/ YCREATE 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秒:
  Z" ], C5 Z; u0 G8 u# ^SELECT o.order_numberFROM outbound oINNER JOIN order_details od    ON o.order_number = od.order_number查询结果相同,运行时间不到一秒:
; V9 N; s9 [1 s, l# p  v2 mSELECT o.order_numberFROM outbound oINNER JOIN(    SELECT order_number    FROM order_details) odON (o.order_number = od.order_number)这让我很惊讶,因为子查询通常要慢得多。
; u: s3 |/ q! ?) {7 i运行EXPLAIN(我还在学习如何理解)显示使用子查询版derived2表,使用索引,索引是auto_key0.我不够聪明,不知道如何解释这一点,以了解为什么会产生重大影响。
4 s+ {+ |7 Q6 F# |, F! o3 @我正在通过命令操作这些查询。
; P: R) y) |4 @/ u0 ]5 g适用于我的操作Linux(x86_64)CentOS的MySQL Ver 14.14 Distrib 5.6.35。: l3 F3 v& f: U  O" ]
总之:
8 i" p# L. W% c) t* E为什么这种简单的连接查询比子查询更快?0 f8 X, H! e1 J1 H4 C
                                                                9 O% Q& C7 t5 x" z4 x; r
    解决方案:                                                               
$ c  n9 v$ e) A# z4 n( p                                                                我对MySQL了解非常有限。但这些都是我的想法:
* P! V- `' A4 d! Z你的手表没有索引。然后,连接必须读取整个第二张表,以便比较第一张表的每一行。2 b$ j5 r( x% D* @! N+ T7 k* \
子查询一次读取第二张表并创建索引,然后不需要为第一张表的每一行读取整个第二张表。它只需要检查索引,这要快得多。: W' ?; c; u4 x7 ?6 `5 s
要验证我是否在尝试,请尝试两个表中order_number列创建索引(CREATE INDEX, a) m0 w: |  Z$ }
…),然后再次运行这两个查询。您的第一个查询只需要不到一秒钟的时间,而不是一分钟。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则