婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > mysql利用覆蓋索引避免回表優化查詢

mysql利用覆蓋索引避免回表優化查詢

熱門標簽:曲靖移動外呼系統公司 百應電話機器人優勢 怎樣在地圖標注銷售區域 地圖標注費用是多少 啥是企業400電話辦理 南昌三維地圖標注 電話外呼系統改號 外呼系統打電話上限是多少 武漢網絡外呼系統服務商

前言

說到覆蓋索引之前,先要了解它的數據結構:B+樹。

先建個表演示(為了簡單,id按順序建):

id name
1 aa
3 kl
5 op
8  aa
10 kk
11 kl
14 jk
16 ml
17 mn
18 kl
19 kl
22 hj
24 io
25 vg
29 jk
31 jk
33 rt
34 ty
35 yu
37 rt
39 rt
41 ty
45 qt
47 ty
53 qi
57 gh
61 dh

 以主鍵以外的列值作為鍵值構建的 B+ 樹索引,我們稱之為非聚集索引。

非聚集索引與聚集索引的區別在于非聚集索引的葉子節點不存儲表中的數據,而是存儲該列對應的主鍵,想要查找數據我們還需要根據主鍵再去聚集索引中進行查找,這個再根據聚集索引查找數據的過程,我們稱為回表。

B+樹

B+樹和B樹是mysql索引的常用數據結構,B+樹是B樹的進一步優化,將上面的表轉成圖分析一下:

B+樹的特點:

1.B+ 樹非葉子節點上是不存儲數據的,僅存儲鍵值

2.葉子節點的數據是按照順序排列的

3. B+ 樹中各個頁之間是通過雙向鏈表連接

聚簇索引和非聚簇索引

B+ 樹索引按照存儲方式的不同分為聚集索引和非聚集索引。

聚簇索引:

以 InnoDB 作為存儲引擎的表,表中的數據都會有一個主鍵,即使你不創建主鍵,系統也會幫你創建一個隱式的主鍵。

這是因為 InnoDB 是把數據存放在 B+ 樹中的,而 B+ 樹的鍵值就是主鍵,在 B+ 樹的葉子節點中,存儲了表中所有的數據。

這種以主鍵作為 B+ 樹索引的鍵值而構建的 B+ 樹索引,我們稱之為聚集索引。

非聚簇索引:

以主鍵以外的列值作為鍵值構建的 B+ 樹索引,我們稱之為非聚集索引。

非聚集索引與聚集索引的區別在于非聚集索引的葉子節點不存儲表中的數據,而是存儲該列對應的主鍵,想要查找數據我們還需要根據主鍵再去聚集索引中進行查找,這個再根據聚集索引查找數據的過程,我們稱為回表。

如何用覆蓋索引避免回表

為什么明明用了非主鍵索引還會回表,簡單說就是非主鍵索引是非聚簇索引,在B+樹葉子節點中只保存主鍵和該非主鍵索引,一次查詢只能查到這兩個字段,如果想查三個字段,就必須再查一次聚簇索引,這就是回表。

舉個例子,表中新增一個字段age,我們用name建一個索引(非聚簇索引)

id name age
10  zs 23
7 ls 54
13 ww 12
5 zl 76
8 xw 23
12 xm 43
17 dy 21

select id,name from user where name = 'zs';

能夠命中name索引,索引葉子節點存儲了主鍵id,通過name的索引樹即可獲取id和name,無需回表,符合索引覆蓋,效率較高。

select id,name,age from user where name = 'zs';

能夠命中name索引,索引葉子節點存儲了主鍵id,但age字段必須回表查詢才能獲取到,不符合索引覆蓋,需要再次通過id值掃碼聚集索引獲取age字段,效率會降低。  

結論:那怎么做才能避免回表呢?很簡單,將單列索引(name)升級為聯合索引(name,age).

總結

到此這篇關于mysql利用覆蓋索引避免回表優化查詢的文章就介紹到這了,更多相關mysql覆蓋索引避免回表優化查詢內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • MySQL 的覆蓋索引與回表的使用方法
  • mysql回表致索引失效案例講解
  • mysql索引覆蓋實例分析
  • MySQL中的回表和索引覆蓋示例詳解

標簽:錦州 吉林 資陽 滄州 黑河 甘南 隨州 荊州

巨人網絡通訊聲明:本文標題《mysql利用覆蓋索引避免回表優化查詢》,本文關鍵詞  mysql,利用,覆蓋,索引,避免,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《mysql利用覆蓋索引避免回表優化查詢》相關的同類信息!
  • 本頁收集關于mysql利用覆蓋索引避免回表優化查詢的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 广州市| 静宁县| 富民县| 桐庐县| 塘沽区| 庆元县| 东兰县| 达州市| 朝阳市| 台州市| 金塔县| 阳山县| 安达市| 灯塔市| 轮台县| 微山县| 藁城市| 保定市| 永康市| 德安县| 通城县| 安陆市| 河池市| 商城县| 通河县| 鄄城县| 宣汉县| 仁怀市| 疏勒县| 呼伦贝尔市| 永昌县| 江安县| 东莞市| 嘉峪关市| 平利县| 堆龙德庆县| 晋江市| 法库县| 兴安盟| 鸡西市| 福贡县|