索引(在mysql中也叫做「鍵(key)」)是儲存引擎用於快速找到記錄的一種資料結構。索引對於良好的效能非常關鍵。索引優化應該是對查詢效能優化最有效的手段了。索引可以包含乙個或多個列的值。如果索引包含多個列,那麼列的順序也十分重要,因為mysql只能高效地使用索引的最左字首列。
5.1.1 索引的型別
在mysql中,索引是在儲存引擎層而不是伺服器層實現的。所以,並沒有統一的索引標準
b-tree索引
大多數mysql引擎都支援這種索引。
儲存引擎以不同的方式使用b-tree索引,效能也各有不同,各有優劣。例如,myisam使用字首壓縮技術使得索引更小,但innodb則按照原資料格式進行儲存。再如myisam索引通過資料的物理位置引用被索引的行,而innodb則根據主鍵引用被索引的行。
b-tree通常意味著所有的值都是按順序儲存的,並且每乙個葉子頁到根的距離相同。
b-tree索引能夠加快訪問資料的速度,因為儲存引擎不再需要進行全表掃瞄來獲取需要的資料,取而代之的是從索引的根節點(圖示並未畫出)開始進行搜尋。
b-tree對索引列是順序組織儲存的,所以很適合查詢範圍資料。
索引對多個值進行排序的依據是create table 語句中定義索引時列的順序
可以使用b-tree索引的查詢型別
下面是一些關於b-tree索引的限制:
雜湊索引
雜湊索引(hash index)基於雜湊表實現,只有精確匹配索引所有列的查詢才有效。對於每一行資料,儲存引擎都會對所有的索引列計算乙個雜湊碼(hash code),雜湊碼是乙個較小的值,並且不同鍵值的行計算出來的雜湊碼也不一樣。雜湊索引將所有的雜湊碼儲存在索引中,同時在雜湊表中儲存指向每個資料行的指標。
雜湊索引的限制:
innodb引擎有乙個特殊的功能叫做 「自適應雜湊索引」 。當innodb注意到某些索引值被使用得非常頻繁時,它會在記憶體中基於b-tree索引之上再建立乙個雜湊索引,這樣就讓b-tree索引也具有雜湊索引得一些優點,比如快速得雜湊查詢
建立自定義雜湊索引,思路很簡單:在b-tree基礎上建立乙個偽雜湊索引。這和真正得雜湊索引不是一回事,因為還是使用b-tree進行查詢,但是它使用雜湊值而不是鍵本身進行索引查詢。你需要做的就是在查詢得where子句中手動指定使用雜湊函式
空間資料索引
myisam表支援空間索引,可以用作地理資料儲存。開源關係資料庫系統中對gis的解決方案做得比較好的是postgresql的postgis。
全文索引
其他所有類別
例如tokudb使用分形樹索引(fractal tree index)。scaledb使用patricia tries
索引可以讓伺服器快速地定位到表地指定位置。
索引有如下三個優點:
索引大大減少了伺服器需要掃瞄地資料量。
索引可以幫助伺服器避免排序和臨時表。
索引可以將隨機i/o變為順序i/o
索引並不總是最好的工具。總的來說,只有當索引幫助儲存引擎快速查詢到記錄帶來的好處大於其帶來的額外工作時,索引才是有效的。對於非常小的表,大部分情況下簡單的全表掃瞄更高效。對於中到大型的表,索引就非常有效。但對於特大型的表,建立和使用索引的代價將隨之增長。這種情況下,則需要一種技術可以直接區分出查詢需要的一組資料,而不是一條記錄一條記錄地匹配。例如可以使用分割槽技術、建立元資料資訊表
高效能MySQL 5 建立高效能的索引
儲存引擎使用索引 1 在索引中找到對應值,2 據匹配的索引記錄找到對應資料行。雜湊索引 hash index 基於雜湊表實現,只有精確匹配索引所有列的查詢才有效,只有memory 引擎顯式支援雜湊索引。雜湊索引的限制 innodb有 自適應雜湊索引 當某些索引值被非常頻繁使用時,會在記憶體中基於b ...
高效能mysql(一) 建立高效能索引
單列索引和多列索引 單列索引 多個單列索引的選擇問題 多個or條件 多個單列的效能往往效能很低,盡量建立高效的多列索引。多列索引 選擇合適的索引順序 避免範圍條件 在where子句中,in是有效的,範圍條件會導致後面的索引無效!在order by中,範圍條件和in都會導致無法按照索引排序!按照索引順...
高效能MySQL 第五章建立高效能的索引(2)
高效能的索引策略 一 獨立的列 如果查詢中的列不是獨立的,則mysql就不會使用索引。獨立的列 是指索引列不能是表示式的一部分,也不能是函式的函式。二 字首索引和索引選擇性 索引部分字元會降低索引的選擇性,索引的選擇性是指,不重複的索引值 也稱為基數,cardinality 和資料表的記錄總數 t ...