网站建设公司 青岛,wordpress媒体文件夹,家电维修 做网站还是搞公众号,php零基础做网站今天我们来讲一下最常见和最基本的几个索引使用规则#xff0c;也就是说#xff0c;当我们建立好一个联合索引之后#xff0c;我们的SQL语句要怎么写#xff0c;才能让他的查询使用到我们建立好的索引呢#xff1f;
下面就一起来看看#xff0c;还是用之前的例子来说明。…今天我们来讲一下最常见和最基本的几个索引使用规则也就是说当我们建立好一个联合索引之后我们的SQL语句要怎么写才能让他的查询使用到我们建立好的索引呢
下面就一起来看看还是用之前的例子来说明。
上次我们讲的是等值匹配规则就是你where语句中的几个字段名称和联合索引的字段完全一样而且都是基于等号的等值匹配那百分百会用上我们的索引这个大家是没有问题的即使你where语句里写的字段的顺序和联合索引里的字段顺序不一致也没关系MySQL会自动优化为按联合索引的字段顺序去找。
现在看第二个规则就是最左侧列匹配这个意思就是假设我们联合索引是KEY(class_name, student_name, subject_name)那么不一定必须要在where语句里根据三个字段来查其实只要根据最左侧的部分字段来查也是可以的。
比如你可以写select * from student_score where class_name‘’ and student_name‘’就查某个学生所有科目的成绩这都是没有问题的。
但是假设你写一个select * from student_score where subject_name‘’那就不行了因为联合索引的B树里是必须先按class_name查再按student_name查不能跳过前面两个字段直接按最后一个subject_name查的。
另外假设你写一个select * from student_score where class_name‘’ and subject_name‘’那么只有class_name的值可以在索引里搜索剩下的subject_name是没法在索引里找的道理同上。
所以在建立索引的过程中你必须考虑好联合索引字段的顺序以及你平时写SQL的时候要按哪几个字段来查。
第三个规则是最左前缀匹配原则即如果你要用like语法来查比如select * from student_score where class_name like ‘1%’查找所有1打头的班级的分数那么也是可以用到索引的。
因为你的联合索引的B树里都是按照class_name排序的所以你要是给出class_name的确定的最左前缀就是1然后后面的给一个模糊匹配符号那也是可以基于索引来查找的这是没问题的。
但是你如果写class_name like ‘%班’在左侧用一个模糊匹配符那他就没法用索引了因为不知道你最左前缀是什么怎么去索引里找啊
第四个规则就是范围查找规则这个意思就是说我们可以用select * from student_score where class_name‘1班’ and class_name5班’这样的语句来范围查找某几个班级的分数。
这个时候也是会用到索引的因为我们的索引的最下层的数据页都是按顺序组成双向链表的所以完全可以先找到’1班’对应的数据页再找到’5班’对应的数据页两个数据页中间的那些数据页就全都是在你范围内的数据了
但是如果你要是写select * from student_score where class_name‘1班’ and class_name‘5班’ and student_name‘’这里只有class_name是可以基于索引来找的student_name的范围查询是没法用到索引的
这也是一条规则就是你的where语句里如果有范围查询那只有对联合索引里最左侧的列进行范围查询才能用到索引
第五个规则就是等值匹配范围匹配的规则如果你要是用select * from student_score where class_name‘1班’ and student_name‘’ and subject_name‘’那么此时你首先可以用class_name在索引里精准定位到一波数据接着这波数据里的student_name都是按照顺序排列的所以student_name‘也会基于索引来查找但是接下来的subject_name’是不能用索引的。
所以综上所述一般我们如果写SQL语句都是用联合索引的最左侧的多个字段来进行等值匹配范围搜索或者是基于最左侧的部分字段来进行最左前缀模糊匹配或者基于最左侧字段来进行范围搜索这就要写符合规则的SQL语句才能用上我们建立好的联合索引