【问题标题】:What kind of index would be efficient when there is IN clause?当有 IN 子句时,什么样的索引会有效?
【发布时间】:2016-06-08 17:27:43
【问题描述】:

这是我的查询:

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)

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

【问题讨论】:

  • 这个答案很大程度上取决于您的数据。不幸的是,在索引方面没有万能的答案。架构、数据、数据分布、如何调用语句等......在确定索引时应考虑所有这些因素。

标签: mysql sql indexing


【解决方案1】:

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

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

【讨论】:

  • 好吧,那我应该从那些多列索引组中删除type 吗?
  • 据我所知,以type 开头或以type 开头的索引将是唯一有用的索引。
  • 目前我有一个像(type, other_id, author_id) 这样的索引。够了吗?
  • 它应该有所帮助,但正如 Kalmino 的评论所指出的,指数的好处很大程度上取决于实际数据。例如:如果您的表有数百万行,并且其中 90% 的行是 type = 4,它仍然会有所帮助,但不如只有 10% 是类型 4 的行数是总行数的两倍。
  • 你知道,我不太懂英语,但我仍然无法理解你回答的这句话:“一旦遇到OR,MySQL 似乎会忽略索引。” 请你改写一下吗?
【解决方案2】:
INDEX(type, author_id)
INDEX(type, post_id)

那些有type,因为它被比较= constant。然后他们有一个IN 子句。较新版本的 MySQL 将通过 IN 集有效地“跨越”(“MRR”)。我不认为他们可以做两个INs

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-13
    • 2013-02-03
    • 2013-05-04
    • 1970-01-01
    • 2010-10-09
    • 2014-07-15
    • 2015-06-29
    • 1970-01-01
    相关资源
    最近更新 更多