MySQL學習筆記(七) 之B 樹索引查詢詳解

2021-10-19 11:39:46 字數 2111 閱讀 1734

一. b+樹索引查詢流程

(四) 索引用於分組

(五) 回表的代價

二. 如何更好地建立和使用索引

老規矩–妹妹鎮樓:

且執行查詢語句之前,需要生成乙個執行計畫,需要計算使用不同索引執行查詢時所需要的成本,選取成本最低的那個索引執行查詢,當索引過多時會導致成本分析耗時過多,影響查詢語句效能。

全表掃瞄表示掃瞄表中的所有記錄,判斷每一條記錄是否符合搜尋條件。如果我們只需要掃瞄某個區間或者某些區間中的記錄,就可以減少需要掃瞄的記錄數量。待掃瞄記錄的id值所在的區間稱為掃瞄區間,把形成這個掃瞄區間的搜尋條件稱為形成這個掃瞄區間的邊界條件。

單點掃瞄區間為只包含乙個值的掃瞄區間;範圍掃瞄區間為包含多個值的掃瞄區間,查詢列表是需要最終結果集中需要查詢出來的列名稱,每次在掃瞄區間中獲取一條二級索引記錄,就需要根據該二級索引記錄的主鍵列的值執行回表操作,到聚簇索引中找到相應的聚簇索引 記錄。如果想使用某個索引來執行查詢,但是又無法通過搜尋條件形成合適的掃瞄區間來減少需要掃瞄的記錄數量時,則不考慮使用這個索引進行查詢。

1. 概述

查詢語句中,經常使用order by 子句對查詢出來的記錄按照某種規則排序,一般情況下,將記錄載入到記憶體中,使用排序演算法排序,mysql中這種在記憶體或磁碟中進行排序的方式稱為檔案排序。如果將索引用於排序中,就可以省去效能上的消耗了,即直接在order by子句中使用索引列進行排序,按照索引的b+樹的方式進行排序。

2. 不可使用索引排序的情況

(1) asc , desc混用

對於使用聯合索引進行排序的場景,要求各個排序列的排序規則是一致的,要麼都是公升序(asc),要麼都是降序(desc)。

(2) 排序列包含非同乙個索引的列

如果排序列中有不在當前索引中的列,這些列是無法按照當前索引的結構進行排序的。

(3) 排序列是某個聯合索引的索引項,但是這些排序列在聯合索引中不連續

聯合索引的列的順序都是在定義索引時設定好的,索引的結構也是按照這種順序搭建的,如果排序列不是聯合索引中的連續列,就無法一一按照索引中的順序進行排序。

(4) 用來形成掃瞄區間的索引列於排序列不同

(5) 排序列不是以原列名出現在order by子句中

索引列以修飾過的形式出現在order by子句中,那麼innodb直接以修飾後的索引列名進行排序,不會按照原有的索引列名排序。

原來的分組會建立用於統計的臨時表,在掃瞄聚簇索引的記錄時將統計的中間結果填入臨時表中,掃瞄完記錄後,再將臨時表中的結果作為結果集傳送給客戶端。分組也可以利用索引,都是樹結構的,使用索引就不再需要建立臨時表了。

對於innodb儲存引擎,索引中的索引頁都必須存放在磁碟中,等到需要使用時載入到記憶體使用。由於每個頁之間是不一定相鄰的,因此在進行回表操作時,如果對應的聚簇索引記錄所在的頁面不在記憶體中,就需要將該頁面從磁碟載入到記憶體中,由於要讀取很多主鍵值不連續的聚簇索引記錄,分布在不同的索引頁中,毫無規則,因此會造成大量的隨機i/o。

所以到底需不需要進行二級索引+回表,還是直接進行全表掃瞄,這得由查詢優化器事先針對表中的記錄進行統計,計算需要執行回表操作的記錄數,如果需要執行回表操作的記錄數越多,則越傾向於使用全表掃瞄。

只為了出現在where子句,order by子句,group by子句,連線子句中的連線列建立索引,僅出現在查詢列表中的列就沒必要建立索引了。

在為某個列建立索引時,如果該列中不重複值的個數比例越低,則說明該列包含過多重複值,那麼會進行過多的回表操作。

索引列盡量使用較小的型別,因為越小索引占用的儲存空間就越小,在乙個索引頁中就可以存放更多的記錄,磁碟i/o帶來的效能損耗就越小。這對於主鍵也是適用的,因為不僅聚簇索引會儲存主鍵,二級索引都會儲存主鍵。

如果只在查詢列表中包含索引列,那麼就能徹底告別回表,直接從二級索引記錄中讀出查詢列表中的列即可。這種索引中已經包含了所有需要讀取的列的查詢方式稱為覆蓋索引。

如 where key * 2 < 4

這種where子句innodb不會嘗試簡化表示式,會直接將 key * 2當做列名嘗試形成掃瞄區間,明顯無法形成合適的掃瞄區間來較少需要掃瞄的記錄數量。

而where key < 4/2

key就是單獨出現的,能夠通過key列進行索引。

MySQL索引之B 樹索引

b 樹索引是是目前關係型資料庫系統中查詢最為常用和最為有效的索引,b 樹的索引構造類似於二叉樹,根據鍵值 key value 快速找到資料。1 什麼是b 樹?首先,b 樹中的b並不是二叉樹 binary 的意思,這裡的b表示的是blance即平衡的意思。那麼b 樹其實就是平衡查詢樹。其滿足兩個條件 ...

MySql索引之B 樹

使用何種資料結構作為索引底層實現的乙個重要衡量指標就是磁碟io的操作次數。對於資料庫而言,索引本身也很大,需要以索引檔案的形式儲存在磁碟上,因此磁碟io操作次數直接決定了索引的效能。b 樹能夠有效利用系統對磁碟的塊讀取特性,在讀取相同磁碟塊的同時,盡可能多的載入索引資料,來提高索引命中效率,從而達到...

Mysql之B樹索引

聚集索引 簡單概念 乙個表中根據主鍵建立的一棵b 樹,索引的葉子節點存放了表中所有的記錄,儲存記錄在物理位置上是連續的,乙個葉子節點存放一條對應的記錄 ps 是根據主鍵建立的b 樹,葉子節點存資料記錄 舉個例子 以漢語字典為例 漢語字典的正文本身就是乙個聚集索引,比如我們要查 安 字,由於漢語詞典的...