1.索引覆盖
现象:在利用二级索引查询时,只能查询到主键值,然后需要再查询主键索引树,才能得到对应行数据.
原因:可以减少回表的次数,提高查询性能.
应用:建立联合索引
eg:
select name from table where id_card between 10 and 15;//id_card为普通索引.
优化:建立联合索引(id_card,name)
2.在建立联合索引的时候,如何安排索引内的字段顺序?
频繁查询的字段在联合索引中应该尽量靠左设计,能少维护一个索引是一个.
3.在建立联合索引的时候,如果需要对单个索引字段进行查询,该如何设计?
eg:有联合索引(a,b),但还需要查询单独基于a或b进行查询.因基于b进行查询时,是不能利用索引(a,b)的.故此时需要按照a和b谁的字段小谁就再单独建一个索引.若b的字段比a小,就建立(a,b),(b)两个索引.
3.索引下推(Index Condition Pushdown,ICP)
3.1mysqlv5.6之后引入ICP
3.2在使用联合索引的时候,按照最左匹配原则没有匹配到的字段该怎麼办?如以下情况:
前提:建立了联合索引(name,age)
select name from table where name like '李%' and age = 10 ans ismale = true;
因mysql 会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配。范围列可以用到索引,但是范围列后面的列无法用到索引。即,索引最多用于一个范围列,因此如果查询条件中有两个范围列则无法全用到索引.
故此时根据 name like '李%' 可以利用索引,找到第一个name以李开头的记录(记作ID4),避免全表查询.然后判断其他条件是否满足。
mysqlv5.6之前:
age字段不能利用索引,只能从 ID4 开始一个个回表。到主键索引上找出数据行,再对比字段(age和iamale)值.
mysqlv5.6之后:
age字段能利用索引, 可以在索引遍历过程中,对索引中包含的字段(age)先做判断,直接过滤掉不满足条件的记录,减少回表次数。