覆盖索引
覆蓋索引
基本介紹
1、如果一個索引包含所有需要查詢的字段的值,我們稱之為覆蓋索引
2、不是所有類型的索引都可以稱為覆蓋索引,覆蓋索引必須要存儲索引列的值
3、不同的存儲實現覆蓋索引的方式不同,不是所有的引擎都支持覆蓋索引,memory不支持覆蓋索引
優勢
1、索引條目通常遠小于數據行大小,如果只需要讀取索引,那么mysql就會極大的較少數據訪問量
2、因為索引是按照列值順序存儲的,所以對于IO密集型的范圍查詢會比隨機從磁盤讀取每一行數據的IO要少的多
3、一些存儲引擎如MYISAM在內存中只緩存索引,數據則依賴于操作系統來緩存,因此要訪問數據需要一次系統調用,這可能會導致嚴重的性能問題
案例
1、當發起一個被索引覆蓋的查詢時,在explain的extra列可以看到using index的信息,此時就使用了覆蓋索引
mysql> explain select store_id,film_id from inventory\G *************************** 1. row ***************************id: 1select_type: SIMPLEtable: inventorypartitions: NULLtype: index possible_keys: NULLkey: idx_store_id_film_idkey_len: 3ref: NULLrows: 4581filtered: 100.00Extra: Using index 1 row in set, 1 warning (0.01 sec)2、在大多數存儲引擎中,覆蓋索引只能覆蓋那些只訪問索引中部分列的查詢。不過,可以進一步的進行優化,可以使用innodb的二級索引來覆蓋查詢。
例如:actor使用innodb存儲引擎,并在last_name字段又二級索引,雖然該索引的列不包括主鍵actor_id,但也能夠用于對actor_id做覆蓋查詢
mysql> explain select actor_id,last_name from actor where last_name='HOPPER'\G *************************** 1. row ***************************id: 1select_type: SIMPLEtable: actorpartitions: NULLtype: ref possible_keys: idx_actor_last_namekey: idx_actor_last_namekey_len: 137ref: constrows: 2filtered: 100.00Extra: Using index 1 row in set, 1 warning (0.00 sec)總結
- 上一篇: MYSQL performance sc
- 下一篇: join的实现原理