我正在考虑向 MySQL 数据库中的表添加复合索引,该表的大小可能有几百万行。复合将由两varchar
列和三列 int 组成。
我的问题如标题中所述:是否存在创建此复合索引的最佳顺序?
例如,其中int
一行可能只有 6 个可能的值,该列更靠近索引定义的前面会更好吗?同样,其中一varchar
列可能有数百万个不同的值,应该靠近索引定义的前面还是后面?
我正在考虑向 MySQL 数据库中的表添加复合索引,该表的大小可能有几百万行。复合将由两varchar
列和三列 int 组成。
我的问题如标题中所述:是否存在创建此复合索引的最佳顺序?
例如,其中int
一行可能只有 6 个可能的值,该列更靠近索引定义的前面会更好吗?同样,其中一varchar
列可能有数百万个不同的值,应该靠近索引定义的前面还是后面?
根据经验,在多列索引中,您希望具有最高基数的列,或者换句话说,最多不同值的列在索引中排在第一位。
更准确地说,您首先希望与您的搜索条件匹配最少的列,以便您可以尽可能缩小结果集,但一般来说,它与最高基数相同。
因此,在您的示例中,您将希望具有数百万个不同值的列在索引中位于只有 6 个不同值的列之前。
假设您只从数百万个值中选择一行,它可以让您更快地消除更多行。
在考虑具有相似基数的两列时,将较小的列放在第一位(INTEGER
列在VARCHAR
列之前),因为 MySQL 可以更快地比较和迭代它们。
一个警告是,如果您选择范围(例如),那么您希望范围列最右边,而您的列在左边WHERE datecol > NOW()
有一个常量(例如)。WHERE id = 1
这是因为您的索引只能用于搜索和排序,直到第一个范围值为止。