mysql效能調優(四)——聚簇索引、索引覆蓋
1、聚簇索引
這裡說的,聚簇索引是相對InnoDB資料庫引擎來說的,講的是聚簇索引隨機主鍵值的效率
對於InnoDB來說,主鍵儘量用整型,並且是遞增的比較好,因為新增的時候,如果是隨機主鍵插入,會存在節點分裂的現象。InnoDB節點下掛載的是資料行,內容比較大(myISAM不同,其節點下儲存的是物理行地址,內容比較小)。你可以想象一下,你搬家,東西多和少的區別。。。
2、索引覆蓋
這裡說的,索引覆蓋是相對myISAM引擎來說的,其資料結構是B-tree,其節點下儲存的資料所在的物理行地址:B-樹是有2種節點的,一種是索引節點,另外一種是葉子節點,葉子節點是用來儲存資料的,索引節點則是用來告訴使用者儲存在葉子節點中的資料順序並幫助使用者找到對應的資料
B-tree和B+tree的區別就是,B-樹可以在非葉子節點命中,所以呢,如果一條sql語句在查詢的資料剛好在索引中,而且查詢的列剛好是索引中的一部分,那麼就不需要再回行查詢資料了。效率比較快
補充:
如果你要想檢視一下 表的索引或者想看看索引的應用,可以用如下命令:
desc table_name (查看錶的描述)
set names utf8;
reset query cache;
set profiling=on;
show profiles;
在show profiles的結果展示中 Extra : Using index 這樣的描述,那麼恭喜,用上了索引,效率相當高
索引使用的時候注意:
建立索引之後,索引的查詢條件得保持順序、型別一致(左字首)
用explain select * from 'user' where phone=1005 用explain可以檢視有沒有選擇索引查詢
由於phone是String型別的,所以在使用索引的時候,需要改成phone='1005'才能正確用索引
用主鍵ID查詢,主動用主鍵索引
在索引列上,進行條件查詢,一定要保證索引列是獨立的,獨立的意思是:索引列不能使用函式,也不能是表示式的一部分