我有一个与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)列,不会影响性能。
是的,
OR
通常是优化杀手。
b.COLUMN IN (value)
始终是单个“值”吗?那么可以写成b.COLUMN = value
吗?
这可能有帮助:
b: INDEX(id2, column) -- this may avoid the sort
看起来较慢的查询结果将包括 id2 != 12345 和/或 COLUMN NOT IN (value);这是可以预料的吗?