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 ##建议,只会重建一次

浙公网安备 33010602011771号