再来看看几个最常见和最基本的索引使用规则

本文详细介绍了数据库联合索引的工作原理,强调了最左前缀匹配原则在查询优化中的重要性。通过实例解析,说明了如何正确使用等值匹配、范围查询以及LIKE操作符来最大化利用索引。同时,阐述了范围查询仅能对联合索引最左侧列进行的限制,以及在编写SQL查询时应遵循的策略,以确保索引的有效利用。
摘要由CSDN通过智能技术生成

最左侧列匹配,这个意思就是假设联合索引是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_name<'5班’这样的语句来范围查找某几个班级的分数。这个时候也是会用到索引的,因为索引的最下层的数据页都是按顺序组成双向链表的,所以完全可以先找到’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语句,才能用上建立好的联合索引!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值