本篇中记录下数据库索引相关的知识点!
索引是什么?
举个例子;大家去图书馆借书时,会先在电脑检索书名或作者等关键字信息,查询出该本书对应的一个图书索引后,紧接着就可以拿着这个图书索引去精确定位存放该索引范围内的书架并找到这本书!
所以数据库索引也是这个作用,通过在表的一列或多个列上建立索引对象,用于加快数据的检索。但索引也有缺点,过多的索引会占用硬盘空间以及导致insert、update、delete语句的执行效率降低!
一般来说,每家公司可能存在自己的一套规范;也可参照以下的比较通用的索引命名规则(通过索引类型简写前缀 + 下划线_ + 字段名(组合索引多个字段则继续加_)拼接而成,名称需使用小写字母,同时避免用到MySQL保留关键字):
uni_[字段名]
来命名,比如用户名唯一索引uni_usernameidx_[字段名]
来命名,比如用户名普通索引idx_username,用户名手机号组合索引idx_username_phone索引的最佳规则:Primary key > Unique key > 一般索引
下面列举一些索引失效的情况(MySQL8.0版本,根据explain分析执行计划中的key信息是否用到索引):
分以下三种情况(user表的索引有主键索引和唯一索引uni_phone):
分以下两种情况(user表的索引有主键索引和唯一索引uni_phone):
组合索引的最左前缀原则:假如在只建立了一个组合索引(a,b,c)的情况下,那么实际上相当于建立了(a), (a,b), (a,b,c)共三个索引。
但根据最左前缀原则,在使用索引时,只有where a = 'test1'
和 where a = 'test1' AND b = 'test2
和 where a = 'test1' AND c = 'test3
以及where a = 'test1' AND b = 'test2 AND c = 'test3'
会索引生效(条件中的字段顺序可以打乱,但字段必须得满足);
而类似于where b = 'test2'
和 where c = 'test3'
以及where b = 'test2 AND c = 'test3'
则索引失效;
例子(user表的索引有主键索引和组合索引idx_username_email_phone):
索引失效的情况:
索引生效的情况:
user表的索引有主键索引和唯一索引uni_username,在查询中对索引字段username使用了函数,因此这种情况下索引失效:
比如对主键索引执id执行id/2
,则会出现索引失效:
所以在实际中我们应该改成id = a/2
,这时就会索引生效:
user表的索引有主键索引和唯一索引uni_phone,且phone字段类型为varchar类,但在查询条件中没有加引号,所以存在隐式转换,因此这种情况下索引失效:
使用到NOT EXISTS语法会索引失效(user表的索引有主键索引):
存在IS NULL或者IS NOT NULL的null值判断,分两种情况(user表的索引有主键索引和唯一索引uni_username):
注意:以上是MySQL8.0版本的索引失效情况,但在MySQL5.7版本中,除了以上这些情况外,还包括下面的情况会索引失效:
本文地址:https://blog.csdn.net/u013068184/article/details/107298993
如对本文有疑问, 点击进行留言回复!!
网友评论