MySQL覆盖索引,也叫包含索引,通过查看explain中extra列是否有using index判断是否使用覆盖索引。因为覆盖索引要存储索引列的值,所以哈希索引,空间索引,全文索引都不存储索引列的值,MySQL只能使用B-Tree索引做覆盖索引。
innodb的二级索引有唯一索引、普通索引、前缀索引等。二级索引只存储了主键值,相比于聚簇索引,占用的空间要少,意味着innodb的二级索引可以利用这些额外的主键列来做覆盖索引,select actor_id,last_name from table where last_name=‘ss‘(其中actor_id是主键列,last_name是二级索引列)。
MySQL中innodb在二级索引上使用共享锁,但访问主键索引需要排他锁。
延迟关联就是使用覆盖索引查询返回需要的主键,再根据这些主键关联原表获得需要的行,这样减少MySQL扫描那些需要丢弃的行,select … from … where id>(select id from … where …)或者select … from a inner join (select id from a where … order by … limit 100000, 10) as x using id;
只有当索引的列顺序和order by子句的顺序完全一致,MySQL才能够使用索引做排序,还有满足最左前缀匹配原则,如果不满足可以指定索引列的值为常量,也可以使用联合索引,第一个列是常量t,第二列m进行排序,select … from … where t=‘‘ order by m desc;