索引是儲存引擎用於快速找到記錄的一種資料結構。索引對於良好的效能非常關鍵。然而索引經常被誤解,好的索引能夠輕易將查詢效能提高幾個數量級,糟糕的索引則會導致各種問題。
看一本書的時候,一般會先看書的目錄,然後找到對應的頁碼。在mysql中,儲存引擎用類似的方法使用索引,先在索引中找到對應值,然後根據匹配的索引記錄找到對應的資料行。
b-tree索引
如果沒有特別指明型別,一般談及的索引都是指b-tree索引,它使用b-tree資料結構儲存資料。儲存引擎以不同的方式使用b-tree索引,效能也各有不同,各有優劣。
b-tree通常所有的值都是按順序儲存的,並且每乙個葉子頁到根的距離相同。b-tree索引能夠加快訪問資料的速度,因為儲存引擎不再需要進行全表掃瞄來獲取需要的資料,取而代之的是從索引的根結點開始進行搜尋。
通過比較節點頁的值和要查詢的值可以找到合適的指標進入下層字節點,這些指標實際上定義了字節點頁中值的上限和下限。
b-tree索引有一些限制:
雜湊索引
hash index基於雜湊表實現,mysql中只有memory引擎顯示支援雜湊索引。對於表中的每一行資料,儲存引擎都會對所有的索引列計算乙個hash code(可自定義演算法實現hash code),雜湊索引把所有的hash code儲存在索引中,同時在雜湊表中儲存指向每個資料行的指標。
因為索引自身只需儲存對應的雜湊值,所以索引的結構十分緊湊,讓查詢的速度變的非常快。然後,雜湊索引也有它的限制:
空間索引(r-tree)
mysql的myisam表支援空間索引,可以用作地理資料儲存。和b-tree索引不同,空間索引會從所有維度來索引資料。可以有效的使用任意維度來組合查詢。必須使用mysql的gis相關函式來維護資料。但是mysql的gis支援並不完善,所有很多時候並不會使用這個特性。
全文索引其他索引
還有很多第三方的儲存引擎使用不同型別的資料結構來儲存索引。比如tokudb使用分形樹索引(fractal tree index),既有b-tree的很多優點,也避免了b-tree的一些缺點。
索引可以讓伺服器快速定位到表的指定位置,但是這不是索引的唯一作用,索引也有一些其他的附加作用。總結下來索引有如下三個優點:
索引大大減少了伺服器需要掃瞄的資料量。
索引可以幫助伺服器避免排序和臨時表。
索引可以將隨機i/o變為順序i/o。
「三星系統」是評價乙個索引師傅合適某個查詢,定義如下:如果索引將相關的記錄放到一起則獲得一星;如果索引中的資料順序和查詢的排列順序一致則獲得二星;如果索引中的列包含了查詢中需要的全部列則獲得三星。
mysql索引基礎 Mysql 索引基礎
什麼是索引?為什麼要建立索引?索引,其實就是目錄。索引,用於快速找出在某個列中有某個特定值的行。不使用索引,mysql必須從第一條記錄開始查詢整張表,直到找出相關的行,那麼表越大,查詢資料所花費的時間就越多。假如表中查詢的列有乙個索引 目錄 mysql能夠快速定位到達乙個位置去搜尋資料檔案,而不必查...
mysql索引基礎
1.建立索引 alter table table name add index index name column list alter table table name add unique index name column list alter table table name add pri...
MySQL 基礎 索引
索引 主要是為了提高從表中檢索資料的速度,索引分為b型樹索引 btree 和雜湊索引 hash innodb和myisam儲存引擎支援btree型別索引,memory儲存引擎支援hash型別索引,預設為前者索引 mysql支援6中索引 以下情況適合建立索引 以下情況下,不適合建立索引 建立和檢視普通...