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;