(1)查询:
    假设查询的时候,不指定性别,就指定了省份,城市,还有年龄, SQL语句 where province=xx and city=xx and age between xx and xx ,那此时怎么办?因为age不在索引里, 所以根本没法通过age去索引里进行筛选。
    如果把索引设计成(province,city,sex,age),此时你的语句写成 where province=xx and city=xx and age>=xx and age <= xx ,也是没法让age用上索引去筛选的,因为city 和age中间差了一个sex,所以此时就不符合最左侧连续多个字段的原则了。
    其实针对这个问题,大家没必要担心,因为假设有上述场景,那我们完全是可以把age放入联合索引的,设计成(province,city,sex,age)这样的索引,那么在搜索的时候就根据省份, 城市,和年龄来筛选,性别是不限的,此时就可以把where语句写成 where province=xx and city=xx and sex in (‘female’,’male’) and age >=xx and age <= xx .如果SQL写成 这样就可以让整个where语句的条件全部都在索引树里进行筛选和搜索了。

    另外,假设我们在查询语句里,还有一些频繁使用的条件,通常都是兴趣爱好和性格特点,这个兴趣爱好和性格特点往往都是有固定的一些枚举值。
    比如兴趣爱好可以有以下可选:运动,电影,旅游, 性格特点有以下:温柔,霸气,御姐,等
    那么针对这样的一些频繁使用的包含枚举值范围的一些字段,也完全可以加入到联合索引里,可以设计成(province,city,sex,hobby,character,age),这样的一个联合索引,此时假设 出现了这样一个查询,按照省份,城市,性格和年龄进行搜索,此时SQL怎么写?
    还可以上面的思路: where province=xx and city=xx and sex in(xx,xx) and hobby in (xx,xx,xx,xx) and character=xx and age>=xx and age<=xx ,也就是说,即使
    不需要按性别和爱好筛选,但是在SQL语句里可以对这两个字段用in语句,把他们所有的枚举值都放进去,这样的话,就可以顺利让province,city,character,age四个真正要筛选的字段用上 索引,直接在索引里进行筛选都是没问题的。

    1. 那么为什么强调,age字段必须放在联合索引的最后一个?


    很简单,假设where语句里有等值匹配还有范围匹配,此时必须是让联合索引最左侧的多个字段使用等值匹配,接着最后一个字段是范围匹配。因为在SQL里,一旦你的一个字段做范围查询 用到了索引,那个这个字段接下来的条件都不能用索引了。这就是规则!


    所以说,实际设计索引的时候,必须把经常做范围查询的字段放在联合索引的最后一个,才能保证你SQL里每个字段都能基于索引去查询。