当有IN子句时,什么样的索引会有效?

时间:2016-06-08 17:27:43

标签: mysql sql indexing

这是我的问题:

DELETE FROM events WHERE type = 4 AND author_id IN (?, ?) AND post_id IN (?, ?)

这是我目前所有的索引:

(id)  -- PK
(author_id, seen)
(author_id, date_time)
(type, other_id, author_id)
(comment_id, type, author_id)

那么,我应该为上面的查询添加任何新索引吗?

2 个答案:

答案 0 :(得分:2)

我猜想type上的索引可能是唯一有用的索引;因为A IN (B, C, D)转换为A = B OR A = C OR A = D,并且MySQL在遇到OR时似乎忽略了索引。

或者,使用author_idpost_id的可能组合制作/执行查询的四个副本;但除非是性能问题,否则我可能不会推荐它。

答案 1 :(得分:1)

INDEX(type, author_id)
INDEX(type, post_id)

首先有type,因为它与= constant进行了比较。然后他们有一个IN条款。较新版本的MySQL将通过IN集合有效地“跳过”(“MRR”)。我认为他们不能做两个INs

优化器将查看统计信息并选择这两个索引中的哪一个可能更好。

尽管如此,{em>可能可能INDEX(type, other_id, author_id)将是有益的。你在运行什么版本的MySQL?你可以EXPLAIN DELETE ...看看它是如何执行查询的吗?如果您看到“ICP”或“索引条件下推”或“使用索引条件”,那将更好。 (这取决于相对较新的优化。)

相关问题