[问题摘要:2个SQL语句产生相同的结果,但速度不同。一个声明使用JOIN
,其他用途IN
。 JOIN
快于IN
]MySQL(版本5.5):为什么`JOIN`比`IN`子句快?
我尝试了2种SELECT
声明对2个表,命名为 booking_record和夹杂。表夹杂物与表 booking_record有多对一的关系。
(不包括为简单起见表定义。)
首先声明:(使用IN
子句)
SELECT
id,
agent,
source
FROM
booking_record
WHERE
id IN
(SELECT DISTINCT
foreign_key_booking_record
FROM
inclusions
WHERE
foreign_key_bill IS NULL
AND
invoice_closure <> FALSE
)
第二语句:(使用JOIN
)
SELECT
id,
agent,
source
FROM
booking_record
JOIN
(SELECT DISTINCT
foreign_key_booking_record
FROM
inclusions
WHERE
foreign_key_bill IS NULL
AND
invoice_closure <> FALSE
) inclusions
ON
id = foreign_key_booking_record
与300,000行在 booking_record - 表和6,100,000+行内含物 -table;第二个声明在0.08秒内传递了127行,但第一个声明花费了将近21分钟的时间记录。
为什么JOIN
比IN
子句快得多?
我建议你开始使用'EXPLAIN'两个语句并查看结果来探讨这个问题。 – 2014-09-02 13:30:14
第二个还有一个过滤器'id = foreign_key_booking_record'。 – 2014-09-02 13:33:13
性能差异的最可能解释是生成的执行计划中的差异。正如其他答案已经表明的那样,'EXPLAIN'的输出将显示每个查询的执行计划。 IN(子查询)的一个重大性能问题:MySQL可能对外部查询返回的每一行执行子查询。 – spencer7593 2014-09-02 14:09:12