我正在考虑将复合索引添加到 MySQL 数据库中的表中,该表的大小可能有几百万行。该组合将由两个 varchar
列和三个 int 列组成。
我的问题如标题所述:是否存在创建此复合索引的最佳顺序?
例如,int
行之一可能只有 6 个可能的值,该列更靠近索引定义的前面会更好吗?同样,varchar
列之一可能有数百万个不同的值,它应该靠近索引定义的前面还是后面?
最佳答案
根据经验,在多列索引中,您希望具有最高基数的列,或者换句话说,最大数量的不同值,在索引中排在第一位。
为了更准确,您希望首先匹配搜索条件的列最少,这样您就可以尽可能地缩小结果集,但一般来说,它与最高基数相同。
因此,在您的示例中,您希望将具有数百万个不同值的列放在索引中,然后再具有仅 6 个不同值的列。
假设您只从数百万个值中选择一行,它可以让您更快地消除更多行。
当考虑两个基数相似的列时,将较小的列放在第一位(INTEGER
列在 VARCHAR
列之前),因为 MySQL 可以更快地比较和迭代它们。
需要注意的是,如果您选择范围(例如 WHERE datecol > NOW()
),那么您希望范围列最靠右,并且您的列具有单个常量 (例如 WHERE id = 1
) 到左边。这是因为您的索引只能用于搜索和排序到第一个范围值的点。
关于mysql - 是否有订购 MySQL 复合索引的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9537128/