Mysql索引淺析

mysql索引類型mysql

索引數據結構類型:Hash索引、B+Tree索引。sql

常見索引類型:普通索引、惟一索引、主鍵索引、全文索引(Myisam引擎)、組合索引。數據結構

一,聚簇索引與非聚簇索引mysql索引

1,非聚簇索引:葉子結點存放的是數據磁盤地址,非葉子結點存放索引值。這也是爲何myisam存儲引擎會有索引文件和數據文件之分的緣由。
1.1,索引過程:
主鍵索引:B+樹,經過索引值搜索葉子結點數據磁盤地址,而後根據磁盤地址進行I/O操做,找到數據。
非主鍵索引:與主鍵索引一致。
2,聚簇索引:葉子結點存放數據。索引文件與數據文件是同一個文件。
2.1,索引過程:
主鍵索引:經過索引值查找到葉子結點數據。
非主鍵索引:經過索引值查找到葉子結點主鍵索引值,而後重複主鍵索引過程,查找到數據。也就是說非主鍵索引樹,葉子結點存放的是主鍵值。
二,索引建立
1,選擇建立索引的列
通常選擇where條件的列以及join鏈接條件中的列。單個列索引組成的多條件索引效率,與單個列組成的複合索引效率。後者效率更高一些。
2,複合索引下的最左原則
多列組成的複合索引,必須有第一列才能使用到索引。
三,什麼狀況下索引纔會產生效果
mysql只有對如下操做符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些時候的LIKE。
能夠在LIKE操做中使用索引的情形是指另外一個操做數不是以通配符(%或者_)開頭的情形。例如,「SELECT peopleid FROM people WHERE firstname LIKE ‘Mich%’;」這個查詢將使用索引,但「SELECT peopleid FROM people WHERE firstname LIKE ‘%ike’;」這個查詢不會使用索引。
四,分析索引效率
經過explain命令能夠分析sql語句的執行效率。結果字段說明以下:
table:這是表的名字。
type:鏈接操做的類型。下面是MySQL文檔關於ref鏈接類型的說明:
「對於每一種與另外一個表中記錄的組合,MySQL將從當前的表讀取全部帶有匹配索引值的記錄。若是鏈接操做只使用鍵的最左前綴,或者若是鍵不是UNIQUE或PRIMARY KEY類型(換句話說,若是鏈接操做不能根據鍵值選擇出惟一行),則MySQL使用ref鏈接類型。若是鏈接操做所用的鍵只匹配少許的記錄,則ref是一種好的鏈接類型。」
在本例中,因爲索引不是UNIQUE類型,ref是咱們可以獲得的最好鏈接類型。
若是EXPLAIN顯示鏈接類型是「ALL」,並且你並不想從表裏面選擇出大多數記錄,那麼MySQL的操做效率將很是低,由於它要掃描整個表。你能夠加入更多的索引來解決這個問題。預知更多信息,請參見MySQL的手冊說明。
possible_keys:
可能能夠利用的索引的名字。這裏的索引名字是建立索引時指定的索引暱稱;若是索引沒有暱稱,則默認顯示的是索引中第一個列的名字(在本例中,它是「firstname」)。默認索引名字的含義每每不是很明顯。
Key:
它顯示了MySQL實際使用的索引的名字。若是它爲空(或NULL),則MySQL不使用索引。
key_len:
索引中被使用部分的長度,以字節計。在本例中,key_len是102,其中firstname佔50字節,lastname佔50字節,age佔2字節。若是MySQL只使用索引中的firstname部分,則key_len將是50。
ref:
它顯示的是列的名字(或單詞「const」),MySQL將根據這些列來選擇行。在本例中,MySQL根據三個常量選擇行。
rows:
MySQL所認爲的它在找到正確的結果以前必須掃描的記錄數。顯然,這裏最理想的數字就是1。
Extra:
這裏可能出現許多不一樣的選項,其中大多數將對查詢產生負面影響。在本例中,MySQL只是提醒咱們它將用WHERE子句限制搜索結果集。
相關文章
相關標籤/搜索