20

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

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

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

4

1 回答 1

40

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

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

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

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

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

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

于 2012-03-02T17:27:11.860 回答