索引列中的 OR 条件会降低性能

问题描述 投票:0回答:1

我有一个与MySQL执行时间相关的查询。假设我有一个包含 5Cr 记录的表 (A) 和包含 7Cr 记录的表 (B)。表 B 有表 A 的外键 (FK) 参考。(id 列)

我有两个查询,其中一个在 20 秒内执行,另一个在 5 毫秒内执行。

20秒查询:

 SELECT     min(table a.id),
           TABLE b.COLUMN
FROM       TABLE a
INNER JOIN TABLE b
ON         TABLE a.id = TABLE b.id
AND        b.id2(indexed COLUMN) = '12345'
WHERE      b.COLUMN IN (value)
OR         a.id     IN(idslist)
GROUP BY   b.id2,
           b.COLUMN
           -- > Here the B.column is also an indexed column. 

5 毫秒秒查询:

 SELECT     min(table a.id),
           TABLE b.COLUMN
FROM       TABLE a
INNER JOIN TABLE b
ON         TABLE a.id = TABLE b.id
AND        b.id2(indexed COLUMN) = '12345'
WHERE      b.COLUMN IN (value)
GROUP BY   b.id2,
           b.COLUMN -- > Removed A.id from the criteria. 

不知道为什么会出现这种差异。有人可以帮我找出原因吗?

预计 A.id 是主键(pk)列,不会影响性能。

mysql performance query-optimization
1个回答
0
投票

是的,

OR
通常是优化杀手。

b.COLUMN IN (value)
始终是单个“值”吗?那么可以写成
b.COLUMN = value
吗?

这可能有帮助:

b:  INDEX(id2, column)   -- this may avoid the sort

看起来较慢的查询结果将包括 id2 != 12345 和/或 COLUMN NOT IN (value);这是可以预料的吗?

© www.soinside.com 2019 - 2024. All rights reserved.