https://blog.csdn.net/miaoyibo12/article/details/89091329
在创建组合索引时,网上一般的说法会提到:查询时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
将值最大的列作为索引列的第一列。