【发布时间】:2018-07-10 12:00:33
【问题描述】:
我有两张桌子
表 X:数百万或记录
|-----|-----|-----|-----|
| a | b | c | d |
|-----|-----|-----|-----|
表 Y:只有几条记录
|-----|-----|
| e | f |
|-----|-----|
X.d 允许我在X.d = Y.e 上加入两个表
我有以下指标:
- (X.a)
- (X.b)
- (X.c)
- (X.d)
- (X.a、X.b、X.c、X.d)
- (是)
我们的一个应用程序正在执行以下查询,该查询需要很长时间才能运行:
SELECT *
FROM X
INNER JOIN Y ON X.d = Y.e
WHERE
X.a in (1, 2, 3)
AND X.b IS NULL
AND X.c in (4, 5 ,6)
AND X.d in (7, 8, 9)
将INNER JOIN改成LEFT JOIN后,查询速度极快:
SELECT *
FROM X
LEFT JOIN Y ON X.d = Y.e
WHERE
X.a in (1, 2, 3)
AND X.b IS NULL
AND X.c in (4, 5 ,6)
AND X.d in (7, 8, 9)
查看这些查询的解释计划,第一个查询正在执行 full scan,而第二个查询仅在我的复合索引上执行 Index Scan (range)。
我在 SO 上看到过其他帖子,但他们有不同的场景。
为什么计划如此不同?
【问题讨论】:
-
我不知道原因,但你可以尝试用
USE KEY或FORCE KEY“修复”它。 -
请为每个查询提供
EXPLAIN SELECT ...。
标签: mysql performance left-join inner-join mariadb