mysql索引【第二篇】

覆盖索引:    [t表中  card为普通索引,id为自增主键]
select * from  t where card=111

select id from t where card=222 

第一个sql中,通过索引card检索到card=111后需要回表到主键将整行数据取出来

第二个sql中,由于id为自增主键,card的叶子节点上的值为id,可以直接提供查询结果,不需要再次回表查询,索引card覆盖了我们的查询需求,称之为覆盖索引。

作用:可以减少树的搜索次数,显著提升查询性能,作为常用的性能优化手短

 

联合索引: 

以【a,b,c】这种形式存在,相当于 a  ,  a,b   a,b,c 三种索引的集合,比如在一个高频率的查询中,需要经过a字段查出b字段的值,可以通过联合索引支持覆盖索引的功能,减少语句执行的时间。当然,联合索引作为冗余存在,这时候就要权衡一下,冗余在支持覆盖索引的同时,对于系统资源的占用

建立原则:  通过调整顺序,可以减少维护的索引,那么顺序要最优先考虑,其次是空间

 

最左前缀索引: 
常见形式语句:select * from  t  where name like '张%'

作用:避免全表扫描,通过模糊匹配,利用索引加速检索

 

索引下推: 【name,age都是索引】

比如:select * from t where name like '张%'  and  age=10

mysql5.6之前,会将找到 ‘张%’ 的数据,挨个回表查询整行数据,回表次数很高

mysql5.6之后,引入了索引下推,会先从索引包含的字段中先进行判断是否符合条件,不符合条件的直接过滤掉(也就是只保留age=10的数据),减少回表次数。

 

重建索引:

作用:由于数据删除,或者索引建立不当导致页分裂,数据页有空洞。重建索引可以重新将数据有序插入,提高页面利用率,减少占用空间。

注意:不管是删除主键还是在新建主键,将会将整个表重建的。     所以要在业务空闲的时候去执行,避免影响线上业务

语句:   alter table a drop  index b  ;   alter table a add index(b);      ###不建议这么写,会重建俩次表

              alter  table  a engine=InnoDB    ##建议,只会重建一次 

posted @ 2020-07-01 07:10  天宇星空  阅读(134)  评论(0)    收藏  举报