数据库索引

一、索引的作用:

  答:提高数据查询效率。

二、索引的种类:

  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

posted @ 2022-03-21 16:49  青牛梦旅行  阅读(66)  评论(0)    收藏  举报