mysql - 是否有订购 MySQL 复合索引的最佳方法?

标签 mysql indexing composite-index

我正在考虑将复合索引添加到 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/

相关文章:

mysql - 插入查询 mysql 错误#1364 中的问题

oracle - 将列添加到 Oracle 中的现有索引

java - AppEngine Java 重新索引任务/映射器/作业

Python( Pandas )错误 'the label [Algeria] is not in the [index]'

mysql - 如何避免对带有 order by 语句的前缀查询的 mysql 复合索引进行文件排序?

mySQL:使用条件计算多个表中的唯一键

mysql - 统计mysql中行之间的差异之和

ruby-on-rails - 在创建复合唯一索引时提供文本列长度

适用于范围查询条件的Oracle复合索引

MySQL 的绑定(bind)错误。错误 1452