我正在考虑向MYSQL数据库中的表添加一个复合索引,该数据库的大小可能是几百万行。复合材料将包含两个varchar列以及三个int列。我的问题如标题所述:是否存在创建此综合指数的最佳顺序?例如,其中一个int行可能只有6个可能的值,那么该列是否更接近索引定义的前端?同样,其中一个varchar列可能有数百万个不同的值,如果它们靠近索引定义的前面或后面?
答案 0 :(得分:27)
根据经验,在多列索引中,您希望具有最高基数的列,或者换句话说,最大数量的不同值,在索引中排在第一位。
为了更准确,您希望首先匹配搜索条件的列尽可能少,以便尽可能缩小结果集,但一般来说,它与最高基数相同。
因此,在您的示例中,您将希望具有数百万个不同值的列在仅具有6个不同值的列之前位于索引中。
假设您只选择了数百万个值中的一行,它可以让您更快地消除更多行。
当考虑两个相似基数的列时,先将较小的列放在第一列(VARCHAR列之前的INTEGER列),因为MySQL可以更快地对它们进行比较和迭代。
有一点需要注意的是,如果您选择范围(例如WHERE datecol > NOW()
),那么您希望范围列最右侧,而您的列具有单个常量(例如WHERE id = 1
)向左转。这是因为您的索引只能用于搜索和排序到第一个范围值的点。