这是我的问题:
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)
那么,我应该为上面的查询添加任何新索引吗?
答案 0 :(得分:2)
我猜想type
上的索引可能是唯一有用的索引;因为A IN (B, C, D)
转换为A = B OR A = C OR A = D
,并且MySQL在遇到OR
时似乎忽略了索引。
或者,使用author_id
和post_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”或“索引条件下推”或“使用索引条件”,那将更好。 (这取决于相对较新的优化。)