在資料庫中也稱作是key,是儲存引擎用於快速找到記錄的一種資料結構。其實索引可以理解為書的目錄,就好比我們看書的時候會先找書的目錄,通過目錄找到對應的記錄,而索引也是如此。資料庫的儲存引擎會先使用索引找到對應的值,然後根據匹配的索引記錄找到對應的資料行。例如: select * from sakila.actor where actor_id = 5;
我們在actor_id的列上建立索引,這樣子資料庫引擎查詢的時候就會現在索引上按值進行查詢,然後返回所有包含該值的資料行
索引也不是越多越好,當資料量大的時候,合適的索引會提高效率,不恰當的索引會使效能急劇下降。即使使用的使orm技術,也應該考慮索引
首先我們需要注意的一點是索引是在儲存引擎層實現的而不是伺服器層實現的。所以沒有統一的索引標準。也就是說:不同的索引引擎的工作方式並不相同,也不是所有的儲存引擎都支援所有型別的索引。即使多個儲存引擎支援同一種型別的索引,但是其底層的實現也可能不相同。這種索引就是我們通常所說的索引,如果沒有明確指明型別,大部分說的就是這種索引。使用b-tree的資料結構來儲存資料。大多數mysql引擎都是支援這種型別的索引的。
注意:其實我們說的b-tree,底層的儲存引擎可能使用的是不同的儲存結構。archive這種資料引擎是乙個例外,在5.1之前,這種資料引擎不支援任何索引,直到5.1之後才開始支援單個的自增列索引。
ndb集群儲存引擎內部使用的是t-tree,innodb則使用的是b+tree,但是他們對外都叫做是b-tree索引因為儲存引擎實現索引的方式不同,所以效率也會不同。
myisam使用字首壓縮技術使得索引更小,但innodb則按照原資料格式儲存。b-tree通常表示了所有的值都是按照順序儲存的,並且每乙個葉子頁到根的距離是相同的。myisam索引通過資料的物理位置引用被索引的行,而innodb則是根據主鍵引用被索引的行。(所以innodb一定要有主鍵)
下圖是innodb的b-tree的索引抽象表示
b-tree索引可以加快訪問資料的速度,因為儲存引擎不再需要進行全表掃瞄來獲取資料,應該從索引的根節點進行搜尋。根節點的槽中存放了指向子節點的指標,儲存引擎根據這些指標向下層查詢。通過比較節點頁的值和要查詢的值可以找到合適的指標進入下層子節點,這些指標實際上定義了子節點頁中值的上限和下限。
樹的深度和表的大小直接相關,上圖只描述了一層根節點和葉子頁,其實中間應該有很多層。並且葉子節點指的是被索引的資料,而不是其他的節點頁。b-tree索引適用於全鍵值,鍵值範圍或者鍵字首查詢,其中鍵字首查詢適合用於根據最左字首的查詢
全值匹配全值匹配指的是和索引中的所有的列進行匹配。比如查詢姓名是allen的人。
匹配最左字首只使用索引的第一列。
匹配列字首也可以匹配某乙個列的開頭的部分。這裡也是只使用了索引的第一列。例如查詢所有以j開頭的姓的人。
匹配範圍值可以查詢某乙個值在乙個範圍之間的人。這裡也是只使用了索引的第一列。
精確匹配某一列並範圍匹配另外一列例如可以查詢出所有的姓為allen,名字是k開頭的人。即第一列是全匹配,第二列是範圍匹配。
只訪問索引的查詢索引都是有序的,所以索引還可以用於order by的操作(按順序查詢)。如果order by子句滿足前面列出的幾種查詢型別,則這個索引也可以滿足對應的排序需求。就是說查詢的時候只需要訪問索引,無需訪問資料行。
如果不是按照索引的最左列開始查詢,則無法使用索引。(類似於復合索引,查詢的時候必須用到最開始定義索引的地方)總結不能跳過索引的列;比如建立復合索引a,b,c,不能查詢條件是a和c的,這樣子只會使用到a索引
如果查詢中有某個列的範圍查詢,則其右邊的所有列都無法使用索引優化查詢(like between > 《都屬於範圍查詢)
eg。where last_name = 『smith』 and first_name like 『j%』 and dob = '1997-12-23』這種情況只能使用索引的前兩列。通常這種情況可以使用多個等於條件來代替範圍條件。
其實上面的索引順序可以這麼理解,建立了復合索引(a,b,c)就是相當於建立了索引列的順序相當重要,索引存在限制,這些限制是mysql優化器和儲存引擎使用索引的方式導致的。a索引a,b索引
a,b,c索引
乙個復合索引(a,b,c)就相當於建立了三個索引
mysql高效能索引 mysql高效能索引( )
在開發中,我們知道大多數應用的瓶頸在於sql語句的執行時耗,在這裡並不討論sql語句的安全,僅僅討論高效能sql語句,而與高效能sql語句緊密相連的就是傳說中的 索引。索引 一種工作在儲存引擎端的用於快速找到記錄的一種資料結構。mysql使用索引的方式是 先找到索引的值,再根據索引的值找到資料行。索...
高效能mysql(一) 建立高效能索引
單列索引和多列索引 單列索引 多個單列索引的選擇問題 多個or條件 多個單列的效能往往效能很低,盡量建立高效的多列索引。多列索引 選擇合適的索引順序 避免範圍條件 在where子句中,in是有效的,範圍條件會導致後面的索引無效!在order by中,範圍條件和in都會導致無法按照索引排序!按照索引順...
MySQL資料高效能索引
索引 類似資料的目錄,mysql儲存引擎使用類似方式進行查詢,先去索引找到對應的值,然後根據匹配的索引找到對應的資料行 索引對效能的影響 大大減少伺服器需要掃瞄的資料量。比如我們資料表1000條資料。我們只需要根據條件查詢其中的一條,我們針對這一列建立乙個索引,我們只需要掃瞄著一條就可以了。如果不建...