创建组合索引时,索引列顺序的选择

数据库 专栏收录该内容
7 篇文章 0 订阅

在创建组合索引时,网上一般的说法会提到:查询时where条件中的列的顺序要和创建索引时列的顺序保持一致,否则组合索引会失效。
更进一步来说,组合索引的各个列中,到底谁应该在前,谁应该在后,还是说创建时顺序根本没有影响,只要查询时不违反上述提到的规则即可?

对于mysql的InnoDB引擎来说,组合索引的B+树结构上的叶子节点是按照第一个列的值大小进行排序,譬如对于组合索引(a,b,c),a,b,c是列名,和单独列索引(a):数据在这两个索引树上的顺序是一样的(只有当a列上的值一样时,才会按照b、c列进行排序)。

所以说创建组合索引时,列的顺序对查询效率肯定是有影响的,写成(a,b,c)和(b,a,c)肯定不同

那么,应该怎样选择合适的顺序呢?

《高性能MySQL》一书中提到的一个经验法则:将选择性最高的列放到索引最前列

“选择性最高”指的是差异性最大,也即这一列的重复值最少,这样建立起来的索引树,查找所需要的值时才会速度更快。假设一个表有100行数据,这一列上的值只有两个,那么在这样建立起来的索引树上,它们就对应100个叶子节点(真实结构不是这样,为了记忆方便可以这样理解),一半的节点值都是重复的,通过遍历这些节点,只能过滤掉一半数据,效率显然低下的(如果每个值都不同,遍历一次就能找到对应的数据)。

具体使用方法:

SELECT COUNT(DISTINCT a)/count(*) AS a_selectivity,
				COUNT(DISTINCT b)/count(*) AS b_selectivity,
				COUNT(DISTINCT c)/count(*) AS c_selectivity
FROM table_name

将值最大的列作为索引列的第一列。

  • 2
    点赞
  • 0
    评论
  • 4
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值