是否有订购MYSQL复合索引的最佳方法?

chi*_*azy 15 mysql indexing composite-index

我正在寻找向MYSQL数据库中的表添加复合索引,该数据库的大小可能是几百万行.复合材料将包含两个varchar列以及三个int列.我的问题如标题所述:是否存在创建此综合指数的最佳顺序?例如,其中一个int行可能只有6个可能的值,那么该列是否更接近索引定义的前端?同样,其中一个varchar列可能有数百万个不同的值,如果它们靠近索引定义的前面或后面?

Mar*_*ams 29

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

为了更准确,您希望首先匹配搜索条件最少的列,以便尽可能缩小结果集,但通常情况下,它与最高基数相同.

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

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

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

需要注意的是,如果您选择范围(例如WHERE datecol > NOW()),那么您希望范围列最右侧,而您的列具有单个常量(例如WHERE id = 1).这是因为您的索引只能用于搜索和排序到第一个范围值的点.

  • 基数并不总是正确的标准:我有一个带有多列索引的表,其中索引中的第一列只有两个可能的值,而后续列具有更高的基数.这是因为索引是为特定搜索设计的,该搜索始终只使用2个值中的1个,并且该值会将结果集减少95%.要问的正确问题是哪一列会最大程度地减少结果集,而基数只是一个有用的经验法则. (4认同)
  • @Kai,您的评论使我感到困惑。也许您可以举一个具体的例子。 (2认同)