MySql索引詳解

2021-10-25 02:22:31 字數 1799 閱讀 4338

索引是資料庫裡的乙個用於排序的資料結構,查詢語句使用到索引的時候,就不需要掃瞄整張表去查詢資料,可以提高查詢的速度。但是建立和維護索引需要耗費一定的時間,同時也會影響插入的速度。

mysql主要使用b+樹作為索引結構。

mysql的索引結構主要有hash索引和b+樹索引兩種,hash索引是基於hash表實現的,缺點很多,所以b+樹索引更常用。

hash索引缺點:1.無序,則無法排序,範圍查詢開銷大;2.key值重複率高時,出現大量雜湊衝突,拉鍊很長,索引效率接近於遍歷。

二者優缺點對比:

聚集索引

非聚集索引

按聚集索引進行範圍查詢的效率高,因為索引邏輯順序和資料的物理順序一致,可以讀寫同乙個磁碟塊。

按非聚集索引進行範圍查詢的效率低,可能會頻繁切換訪問不同的磁碟塊。

聚集索引增刪資料記錄效率低,因為要保持表中記錄的物理順序與索引的順序一致,把記錄插入到相應資料頁後,後面的資料還要後移、分頁。(如果主鍵是自增id,那麼插入新記錄的效率會比較高。)

非聚集索引的順序與資料記錄的物理順序無關,增刪資料記錄的效率比較高。

myisam和innodb引擎都是以b+樹作為索引結構,但二者有所區別:

原理剖析:innodb與myisam 聚集索引與非聚集索引

innodb的主鍵索引是聚集索引,輔助索引是非聚集索引。(因為輔助索引的邏輯順序跟對應資料的物理順序不相同)

主鍵索引

innodb是聚集索引,其主鍵索引樹的葉子節點儲存的是主鍵和具體的資料記錄。由下圖可見,innodb的主鍵索引的非葉結點是額外建立的索引結點,而葉子結點其實就是資料表中的資料記錄。

innodb的輔助索引使用非主鍵構建索引樹,其葉子節點儲存的是關鍵字和對應資料記錄的主鍵值,所以通過輔助索引查詢到主鍵值後,還需要根據這個主鍵值去主鍵索引中查詢才能得到具體的資料記錄,這就叫做索引回表。因此輔助索引實際上要查兩次索引,而主鍵索引只需要查詢一次索引。

主鍵索引

主鍵索引就是以主鍵來構建索引,由於myisam是非聚集索引,所以主鍵索引樹的葉子節點儲存的是主鍵和指向資料記錄的指標。由下圖可見,myisam的索引檔案和資料檔案是完全分開儲存的。

乙個資料表只有乙個主鍵索引,但可以有多個輔助索引。myisam的輔助索引使用非主鍵構建索引樹,其葉子節點儲存的也是指標。

注意sql語句中使用索引的部分主要是where子句,去索引上查詢到符合條件的資料記錄,然後再取出select子句中所需的字段。

建立索引的tips:資料庫查詢一般只用到乙個索引,因為比起分析多個索引樹,還不如只分析乙個索引樹然後在符合條件的記錄中順序掃瞄,判斷是否符合剩下的條件。因此如果經常需要同時對多個字段進行and查詢,那麼建立兩個單獨索引不如建立乙個組合索引,因為兩個單獨索引通常資料庫只能使用其中乙個,而使用組合索引因為索引本身就對應到兩個欄位上的,效率會有很大提高。

並不是說建立了索引,並且查詢條件使用了該索引列就一定會使用到該索引。如果優化器認為走索引還不如全表掃表的話,就會選擇全表掃瞄。

比如where age+10=30,由於需要對該列所有資料進行計算,因此不會使用索引。

查詢只使用到組合索引中的後面的列(沒有使用第一列),則索引失效。

MySQL聚集索引詳解 mysql 索引詳解

直接起飛 1.什麼是索引?索引是幫助mysql高效獲取資料的排好序的資料結構。2.索引的資料結構?為什麼選這種結構?假設我們現在這裡有一張表 以下情況都是innodb儲存引擎 idnumber 如果mysql沒有索引這種結構,那麼我們如果查詢number為51的這行記錄,那麼mysql就要從上往下掃...

MySQL聚集索引詳解 mysql索引詳解

資料結構分,有b tree索引 b tree 雜湊索引 r tree索引等。按資料塊的順序和索引節點的邏輯順序是否一致可以分為聚集索引和非聚集索引。聚集索引由於物理塊連續,在範圍掃瞄的時候可以減少磁頭尋道時間,因而比非聚集索引高效。幾種索引型別的選擇 primary 主鍵索引。unique 唯一索引...

mysql 索引定義 MySQL 索引詳解

普通索引 唯一索引和主索引 1.普通索引 普通索引 由關鍵字key或index定義的索引 的唯一任務是加快對資料的訪問速度。因此,應該只為那些最經常出現在查詢條件 where column 或排序條件 order by column 中的資料列建立索引。只要有可能,就應該選擇乙個資料最整齊 最緊湊的...