【问题标题】:Is there an optimal method for ordering a MySQL composite index?是否有订购 MySQL 复合索引的最佳方法?
【发布时间】:2012-03-21 04:22:41
【问题描述】:

我正在考虑向 MySQL 数据库中的表添加一个复合索引,该表的大小可能有几百万行。该组合将由两个 varchar 列和三个 int 列组成。

我的问题如标题所述:是否存在创建此复合索引的最佳顺序?

例如,int 行之一可能只有 6 个可能的值,该列更靠近索引定义的前面会更好吗?同样,varchar 列之一可能有数百万个不同的值,应该靠近索引定义的前面还是后面?

【问题讨论】:

  • 您是否在 WHERE 子句中选择常量,而不是范围?
  • Marcus,我很可能会为该表的大多数查询选择常量。

标签: mysql indexing composite-index


【解决方案1】:

根据经验,在多列索引中,您希望具有最高基数的列,或者换句话说,最多不同值的列在索引中排在第一位。

为了更准确,您首先希望与您的搜索条件匹配最少的列,以便您可以尽可能缩小结果集,但一般来说,它与最高基数相同。

因此,在您的示例中,您希望将具有数百万个不同值的列在索引中位于只有 6 个不同值的列之前。

假设您只从数百万个值中选择一行,它可以让您更快地消除更多行。

当考虑具有相似基数的两列时,将较小的列放在第一位(INTEGER 列在 VARCHAR 列之前),因为 MySQL 可以更快地比较和迭代它们。

需要注意的是,如果您使用范围进行选择(例如WHERE datecol > NOW()),那么您希望范围列最右边,而您的列在左边有一个常量(例如WHERE id = 1)。这是因为您的索引只能用于搜索和排序,直到第一个范围值为止。

【讨论】:

  • 基数并不总是正确的标准:我有一个带有多列索引的表,其中索引中的第一列只有两个可能的值,而后续列的基数更高。这是因为索引是为特定搜索设计的,该搜索始终只使用 2 个值中的 1 个,并且该值将结果集减少了 95%。要问的正确问题是哪一列将减少结果集最多,而基数只是一个有用的经验法则。
  • @Kai,你的评论让我很困惑。也许你可以举一个具体的例子。
  • @MarcusAdams 我明白凯的意思,我认为这里解释得很好:percona.com/blog/2009/06/05/…
  • 谢谢,刚才看了评论,明白了。我根据评论改进了我的答案。
  • 什么会被视为“相似”基数?
猜你喜欢
  • 1970-01-01
  • 2019-04-10
  • 1970-01-01
  • 2013-01-19
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多