数据库索引
一、索引的作用:
答:提高数据查询效率。
二、索引的种类:
1.聚集索引(主键索引):在数据库里面,所有行数都会按照主键索引进行排序。
2.聚集索引:就是给普通字段加上索引。
3.联合索引:就是好几个字段组成的索引,称为联合索引。
联合索引遵守左前缀原则:
A:select * from student where age = 16 and name = '小张' B:select * from student where name = '小张' and sex = '男' C:select * from student where name = '小张' and sex = '男' and age = 18 D:select * from student where age > 20 and name = '小张'<br> E:select * from student where age != 15 and name = '小张'<br> F:select * from student where age = 15 and name != '小张'
A遵从最左匹配原则,age是在最左边,所以A走索引;
B直接从name开始,没有遵从最左匹配原则,所以不走索引;
C虽然从name开始,但是有索引最左边的age,mysql内部会自动转成where age = '18' and name = '小张' and sex = '男' 这种,所以还是遵从最左匹配原则;
D这个是因为age>20是范围,范围字段会结束索引对范围后面索引字段的使用,所以只有走了age这个索引;
E这个虽然遵循最左匹配原则,但是不走索引,因为!= 不走索引;
F这个只走age索引,不走name索引,原因如上;
三、索引的原理:
答:平衡二叉树(B+树,基于二分法的策略提高数据的查找速度的二叉树的数据结构)。
【因果:二叉查找树的“高度”不稳定,会因为数据的插入顺序不一样导致形成“独”树的情形,树太高,导致查找效率急速下降,因而平衡二叉树应运而生】
四、索引的优劣势:
不建议使用索引的情形:
1、数据更新性能比查询性能要求要高的情况下不要使用索引,因为数据的更新的同时索引也要进行维护和更新(加了索引查询快但更新就会慢);
2、不要盲目的给表建太多索引,因为索引本身的存储也要占用存储空间,一旦更新操作频繁反而降低新性能;
3、不要给不经常使用的列建索引,没必要;
4、不要给高重复值的列建索引,索引本身就是为了提高查询速度,然而数据值高度重复,数据区别性不高,索引起不了效果)(比如说:性别);
5、不要给img,tex.bit数据类型使用索引,因为这种字段一般使用很少,数据量太大;
建议使用索引的情形:
1、经常要用于查询的列 where id=?;
2、经常要用于排序(order by),分组(group by)的列,因为索引已经排好序了;
3、有值唯一性限制的列,比如说主键、用户名;
五、不走索引的几种情形:
前提条件:表student中两个字段age,name加了索引。
key 'idx_age' ('age'), key 'idx_name' ('name')
1、含有like的语句:%在前面的不走索引,在后面的走索引。【A走索引,B不走索引】
A:select * from student where 'name' like '王%' B:select * from student where 'name' like '%小'
2、用索引列进行计算的,不走索引。【 A走索引,B不走索引】
A:select * from student where age = 10 + 8 B:select * from student where age + 8 = 18
3、对索引字段使用了函数,不走索引。【 A走索引,B不走索引】
A:select * from student where name = concat('王哈','哈'); B:select * from student where concat('name','哈') ='王哈哈';
4、索引列用了!= 不走索引。
select * from student where age != 18
本文参考:https://www.cnblogs.com/wwxzdl/p/11116446.html
人生很长,一秒太短,一个月不长不短刚刚好! 加油少年! ---------LeaningBD
本文来自博客园,作者:青牛梦旅行,转载请注明原文链接:https://www.cnblogs.com/mengxiangtiankongfenwailan/p/16035390.html

浙公网安备 33010602011771号