天天看點

Mysql資料庫索引

索引(index)是幫助mysql高效擷取資料的資料結構。對于高性能非常關鍵。

索引的重要性主要展現在資料量非常大的時候。規模小,負載輕的資料庫即使沒有索引也可以獲到好的查詢效果

例如:

 1 mysql>select

first_name from actor where

actor_id=5; 

改索引列位于actor_id列,是以mysql會使用索引找到actor_id為5的行。

索引有很多種類型,各自有各自的特點。索引實在存儲引擎層實作的,而不是伺服器層。

(1)、b-tree索引

  談論引擎多半指的是b-tree引擎。大部分的存儲引擎都支援此種索引

  mysql存儲引擎使用不同的方式把索引儲存到磁盤上,他們會影響性能。例如,myisam使用字首壓縮來減小索引,而innodb不會使用壓縮索引,因為它不能把壓縮索引用于某些優化。同樣,myisam索引按照存儲的實體位置引用被索引的行。但是innodb按照主鍵引用行。

  b-tree索引通常意味着資料存儲是有序的。并且每個葉子頁到根的距離是一樣的。

  b-tree索引加速了資料通路,因為存儲引擎不會掃描整個表得到需要的資料。從根節點開始,根節點儲存了指向子節點的指針,并且存儲引擎會根據指針尋找資料。

(2)哈希索引

  該索引時建立在哈希表的基礎上,它隻對使用了索引中的每一列的精确查找有用。在mysql中隻有memory存儲引擎支援哈希索引。

哈希本身隻是儲存了簡單的哈希值,哈希索引顯得非常緊湊。哈希值的長度不會依賴索引的列。tinyint列的哈希索引和大型字元列的哈希索引大小是一樣的

哈希索引的限制:

  mysql不可以通過哈希索引排序,因為不會按序儲存行

  哈希索引隻支援使用了= 、in()和<=>的相等比較。

  哈希索引隻是包含了哈希碼和行指針,而不是本身,mysql不能使用索引中的值來避免讀取行

  通路哈希索引速度非常快,除非碰撞率很高。當發生碰撞的時候存儲引擎必須通路連結清單中的每一個行指針,然後逐行進行資料的比較,以确定正确的數值。

(3)r-tree索引(空間索引)

  myisam支援空間索引。可以使用如geospatial這樣的地理空間資料類型。和b-tree不同的是空間索引不會要求WHERE字句使用索引的最左前端。它同時全放位的索引了資料。

(4)全文索引(fulltext)

  這是myisam的一種特殊的索引。它從文本中找到關鍵字,而不是直接和索引中的值進行比較。全文搜尋和其他比對類型完全不同。

下一篇: 關于我