(1)前序
    上一节等值匹配就是where语句中的几个字段名称和联合索引的字段完全一样,而且都是基于等号的等值匹配,那肯定用到了索引,即使where语句里写的字段的顺序和联合索引里的字段顺序不一致,也没关系,MySQL会自动优化为按联合索引的字段顺序去找。
    下面介绍几种常见的索引使用规则:包括全值匹配规则,最左侧列匹配规则,最左前缀like匹配原则,范围查找规则,等值匹配+范围匹配规则。

    (2)最左侧列匹配规则
    假设我们的联合索引是 KEY(class_name,student_name,subject_name),那么不一定必须要在where语句里根据三个字段来查,其实只要根据最左侧的部分字段来查,也是可以的。
    比如 select from student_score where class_name=’ ‘ and student_name = ‘ ‘ ,查某个学生所有科目的成绩,这是没问题的,
    但是假如 SQL语句 select
    from student_score where subject_name = ‘ ‘ ,这样就不行了,因为在联合索引的B+树里,是必须先按class_name查,再按student_name查,不能跳过前面两个字段,不能直接按照最后一个subject_name 查。
    另外,假如 SQL语句 select * from student_score where student_name = ‘ ‘ and subject_name = ‘ ‘ ,那么只有class_name的值可以在索引搜索,剩下的subject_name是没法在索引里找的,原理同上,不能跳过联合索引的字段,需要是连续的。
    所以在建立索引的过程中,必须考虑好联合索引字段的顺序,以及平时写SQL的时候是按哪几个字段来查。

    (3)最左前缀匹配原则
    如果要用like语法来查,比如:select * from student_score where class_name like ‘1%’ ,查找1开头的班级的分数,那么也是可以用到索引的。因为联合索引的B+树里,都是按照class_name的确定的最左前缀就是1,然后后面给一个模糊匹配符号,也是基于索引查找的,这是没问题的。
    但是假如写成 ‘%班’ 在左侧使用模糊匹配符,那就没法用索引了,因为不知道最左前缀是什么。

    (4)范围查找规则:范围查询时只有第一个字段的范围查询生效
    比如SQL语句 select from student_score where class_name > ‘1班’ and class_name < ‘5班’ 这样的语句来范围查找某几个班级的分数,这个时候也是会用索引的,因为索引的最下层的数据页都是按顺序组成的双向链表,所以完全可以先找到 ‘1班’ 对应的数据页,再找到 ‘5班’ 对应的数据页,两个数据页中间的那些数据页,全部是范围内的数据。
    但是如果SQL语句 select
    from student_score where class_name > ‘1班’ and class_name < ‘5班’ and student_name > ‘’,这里只有 class_name 是可以基于索引来找的,student_name的范围查询是没法用到索引的,
    这也是一条规则,就是where语句如果有范围查询,那只有对联合索引里最左侧的列进行范围查询才能用到索引。

    (5)等值匹配+范围匹配规则
    比如SQL语句 select * from student_score where class_name = ‘1班’ and student_name > ‘’ and subject_name < ‘’ ,此时是class_name在索引精确定位到一定的数据,接着这一定的数据里的student_name 都是按照顺序排列的,所以student_name>’’ 也会基于索引查询,但是接下来的 subject_name < ‘’ 是不能用索引的。

    (6)总结
    综上所述,一般写SQL语句,都是用联合索引的最左侧的多个字段进行 等值匹配+范围搜索,或者基于最左侧的部分字段来进行最左前缀模糊匹配,或者基于最左侧字段来进行范围搜索。所以需要写符合规则的SQL语句,才能用上我们建立好的索引。