MySQL建立高效能的索引(三)

2021-10-23 17:24:14 字數 2075 閱讀 9002

索引分類和區別

索引注意事項

聚簇索引

索引覆蓋

索引是儲存引擎快速找到記錄的一種資料結構。使用索引可以極大的提高mysql的查詢效能,接下來講介紹索引的基礎索引的分類和區別索引的注意事項、以及關於聚簇索引覆蓋索引的知識點。

當你去看一本書,如何快速找到你想開啟的頁? 你一定會先看書的索引部分,在根據索引的頁碼數直接定位到目標頁。相比你一頁頁的去翻看極大的節省了時間。

mysql的索引也是同樣的原理,當我們建立某個索引時,mysql會為我們維護一套索引樹,mysql的索引是在儲存引擎層面實現的,所以不同的儲存引擎,索引儲存的資料結構也不相同,innodb使用的是b+tree的資料結構,是b-tree的一種變種。

全值匹配,指索引是1個或者n個字段組合,所有索引字段參與匹配查詢

匹配最左字首,指索引是n個字段組合,需要從最左字首進行匹配

匹配列字首,指索引可以使用索引字段,like匹配字首內容,如like 『abc%』

精確匹配某一列並範圍匹配另外一列

只訪問索引查詢,這種就是覆蓋查詢,只會遍歷索引,不會訪問資料行

多列索引必須按照最左字首匹配,否則無法應用索引

多列索引中不能跳過索引列,比如a,b,c欄位三個列組合索引,如果查詢使用where a=1 and c=1,則只會使用a列索引

多列索引中範圍查詢的某個列,後面的字段都無法使用索引查詢,如果範圍查詢有限,可以使用in代替

like匹配不可以使用like 『%123』,不會走索引,而like 『123%』可以走索引

索引主要分b-tree、hash索引、全文索引、空間資料索引

b-tree索引是有序排列,非常適合範圍查詢、排序

b-tree多列組合索引,排序按照列的順序排序

b-tree索引支援全值匹配、匹配最左字首、匹配列字首、精確匹配某一列範圍匹配另外乙個列、只訪問索引資料(索引覆蓋查詢)

b-tree不能索引非最左字首、不能跳過索引列、查詢有某個列範圍查詢,則後面的查詢無法使用索引查詢(可以使用等於條件代替範圍查詢)

基於雜湊表實現,需要精準匹配

不支援範圍、部分查詢,不支援排序,

hash衝突使用鍊錶法

innodb支援自適應hash索引,即當mysql發現某些索引頻繁使用時,基於記憶體建立hash索引

空間索引一般做地理資料儲存,一般用的不多

索引不能有表示式、函式參與,否則無法使用索引,且無法應用查詢快取

多列索引應該注意索引的順序,一般選擇性較高的放在第一列

注意某個列是否出現相同的值頻率比較高,比如使用者名稱預設設定guest,導致在某種查詢(查詢等於guest)會趨於掃瞄全表的效能

對於索引字段過長,可以使用hash索引代替

聚簇索引並不是單獨的一種索引型別,而是一種索引的儲存方式,

聚簇索引葉子頁會包括資料行所有的列,節點頁只包含索引列。

mysql會選擇主鍵作為聚簇索引,如果沒有主鍵會選擇唯一非空索引,否則mysql會隱式建立乙個主鍵索引

優點:訪問資料更快。因為索引資料都儲存在b-tree樹上,無需在去獲取資料行資料

使用覆蓋索引掃瞄查詢可以直接使用頁節點中的主鍵值

缺點:更新速度嚴重依賴插入順序

更新聚簇索引代價比較高,會強制innodb把每個被更新的行移動到新的位置

更新移動的同時,有可能會產生頁**,因為移動的新位置原本的頁已經滿了,需要**頁進行儲存

索引覆蓋是一種優化方式,當查詢的列是索引全部覆蓋的列,則只會查詢索引樹,無需再回表查詢;

比如對於分頁偏移量比較大的情況,如limit 100000,20, mysql需要先查詢100020條資料,在取20條,偏移量越大越影響效能;

因此可以採用覆蓋索引的方式;

x = select id from table where id > 100000 limit 20;

在查詢select * from table where id in (x);

上面的方式依賴於自增主鍵的形式,同時記錄列上次的瀏覽記錄。

Mysql建立高效能索引

mysql索引的基礎和型別 索引的基礎 1.索引類似於書籍的目錄,要想找到一本書的某個特定主題,需要先查詢書的目錄,定位對應的頁碼 儲存引擎使用類似的方式進行資料查詢,先去索引當中找到對應的值,然後根據匹配的索引找到對應的資料行 索引對效能的影響 大大減少伺服器需要掃瞄的資料量,比如我們資料表中有一...

高效能mysql(一) 建立高效能索引

單列索引和多列索引 單列索引 多個單列索引的選擇問題 多個or條件 多個單列的效能往往效能很低,盡量建立高效的多列索引。多列索引 選擇合適的索引順序 避免範圍條件 在where子句中,in是有效的,範圍條件會導致後面的索引無效!在order by中,範圍條件和in都會導致無法按照索引排序!按照索引順...

mysql建立高效能的索引

mysql索引的基礎和型別 延伸 mysql索引建立的原則 延伸 mysql索引的注意事項 mysql索引的基礎和型別 1 索引對效能的影響 大大的減少了伺服器掃瞄的資料量 幫助伺服器避免排序和臨時表 將隨機i o變成順序i o 大大提高了查詢的速度,降低了寫的速度,占用磁碟。2 索引的型別 索引有...