索引系列知识三:索引总结
Posted 程序编织梦想
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了索引系列知识三:索引总结相关的知识,希望对你有一定的参考价值。
一、前言
前面二章我们讲解了《 聚集索引与非聚集索引详解 》、《联合索引、覆盖索引和索引下推详解》,大家可以点击查看。这一章我们对什么时候用索引、索引失效的情况进行总结,并编成一个顺口溜方便大家记忆。
二、索引使用场景
2.1 哪些情况需要创建索引
1、主键自动建立唯一索引
这个不用多解释了,主键会自动建立主键索引。
2、频繁作为查询条件的字段应该创建索引 where
打个比方:where a = xxx,我们应该在a 上建立索引。
3、多表关联查询中,关联字段应该创建索引 on 两边都要创建索引。
4、查询中排序的字段,应该创建索引
打个比方:order by a,我们应该在a 上建立索引。
5、联合索引
《联合索引、覆盖索引和索引下推详解》
6、统计或者分组字段,应该创建索引
2.2 哪些情况不需要创建索引
1、表记录太少 索引是要有存储的开销
2、频繁更新索引。
3、查询字段使用频率不高
三、索引失效的情况
1.尽量使用全值匹配。
在联合索引中,尽量使条件与索引一一对应。
2.最左前缀法则要遵守
如果索引了多个列,要遵守最佳左前缀法则。指的是查询从索引的最左前列开始 并且不跳过索引中的列。
举例说明:假如对字段 (a, b, c) 建立联合索引。
where a = xxx and b = xxx and c = xxx //使用索引
where b = xxx //不使用索引
where c = xxx //不使用索引
3.不要在索引上做计算
不要进行这些操作:计算、函数、自动/手动类型转换,不然会导致索引失效而转向全表扫描。
举例说明:
select * from tuser where left(loginname,1)='zy'; //不会使用索引,因为在列上做了计算
4.范围条件右边的列失效
范围条件(bettween、<、>、in等)右边的列会索引失效。
举例说明:
//name和age会使用索引,但是sex不会用索引。
explain select * from tuser where name='asd' and age>20 and sex='1';
5.尽量使用覆盖索引
尽量使用覆盖索引(只查询索引的列),也就是索引列和查询列一致,减少select *
6.索引字段上不要使用不等
索引字段上使用(!= 或者 < >)判断时,会导致索引失效而转向全表扫描
注:主键索引会使用范围索引,辅助索引会失效。
举例说明:
select * from tuser where loginname != 'zhy';//使用了!= ,索引失效
7.主键索引字段上不可以判断null
举例说明:
select * from tuser where name is null;//索引失效,
8.索引字段使用like不以通配符开头
举例说明:
select * from tuser where name like 'a%';//使用索引
select * from tuser where name like '%a';//不使用索引
9.索引字段字符串要加单引号
索引字段是字符串,但查询时不加单引号,会导致索引失效而转向全表扫描
举例说明:
select * from tuser where name=123;//不会使用索引,应改成 where name='123'
10.索引字段不要使用or
索引字段使用 or 时,会导致索引失效而转向全表扫描
举例说明:
select * from tuser where name='asd' or age=23;// 不会使用索引,因为有or.
四、索引顺口溜
总结:
记忆口诀:
\\
全值匹配我最爱,最左前缀要遵守;
带头大哥不能死,中间兄弟不能算;
索引列上少计算,范围之后全失效;
Like百分写最右,索引覆盖不写星;
不等空值还有or,索引失效要少用。
五、结尾
好了,索引系列知识到此结束。希望对大家有所帮助。
另外大家帮忙关注一下我的微信公众号,每天更新优质内容。并赠送上百套学习资料和视频。
以上是关于索引系列知识三:索引总结的主要内容,如果未能解决你的问题,请参考以下文章