亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

mysql利用覆蓋索引避免回表優(yōu)化查詢

 更新時間:2021年02月05日 11:42:22   作者:家有四只胖加菲  
這篇文章主要給大家介紹了關于mysql如何利用覆蓋索引避免回表優(yōu)化查詢的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

說到覆蓋索引之前,先要了解它的數據結構: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+ 樹索引,我們稱之為非聚集索引。

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

B+樹

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

B+樹的特點:

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

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

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

聚簇索引和非聚簇索引

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

聚簇索引:

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

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

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

非聚簇索引:

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

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

如何用覆蓋索引避免回表

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

舉個例子,表中新增一個字段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索引,索引葉子節(jié)點存儲了主鍵id,通過name的索引樹即可獲取id和name,無需回表,符合索引覆蓋,效率較高。

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

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

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

總結

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

相關文章

  • MySQL?CHAR和VARCHAR區(qū)別

    MySQL?CHAR和VARCHAR區(qū)別

    本文主要介紹了MySQL?CHAR和VARCHAR區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • mysql8重置root用戶密碼的完整步驟

    mysql8重置root用戶密碼的完整步驟

    這篇文章主要給大家分享介紹了關于mysql8重置root用戶密碼的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-12-12
  • mysql使用報錯1142(42000)的問題及解決

    mysql使用報錯1142(42000)的問題及解決

    這篇文章主要介紹了mysql使用報錯1142(42000)的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • mysql定時備份shell腳本和還原的示例

    mysql定時備份shell腳本和還原的示例

    數據庫備份是防止數據丟失的一種重要手段,生產環(huán)境中,數據的安全性是至關重要的,任何數據的丟失都可能產生嚴重的后果,所以本文給大家介紹了mysql定時備份shell腳本和還原的實例,需要的朋友可以參考下
    2024-02-02
  • MySql多表鏈接查詢詳細教程

    MySql多表鏈接查詢詳細教程

    這篇文章主要介紹了MySql多表鏈接查詢詳細教程的相關資料,需要的朋友可以參考下
    2022-10-10
  • MySQL慢日志實踐小結

    MySQL慢日志實踐小結

    這篇文章主要介紹了MySQL慢日志實踐小結,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • MySQL NDB Cluster關于Nginx stream的負載均衡配置方式

    MySQL NDB Cluster關于Nginx stream的負載均衡配置方式

    這篇文章主要介紹了MySQL NDB Cluster關于Nginx stream的負載均衡配置方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • mysql字符串分割功能實現(xiàn)

    mysql字符串分割功能實現(xiàn)

    這篇文章主要介紹了mysql字符串分割功能實現(xiàn),本文結合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-02-02
  • MySQL實現(xiàn)數據插入操作的示例詳解

    MySQL實現(xiàn)數據插入操作的示例詳解

    使用MySQL插入數據時,可以根據需求場景選擇合適的插入語句。本文通過給出每個使用場景下的實例來說明數據插入的實現(xiàn)過程和方法,希望對大家有所幫助
    2023-02-02
  • 詳解MySQL下InnoDB引擎中的Memcached插件

    詳解MySQL下InnoDB引擎中的Memcached插件

    這篇文章主要介紹了詳解MySQL下InnoDB引擎中的Memcached插件,并且給出了實例演示,需要的朋友可以參考下
    2015-04-04

最新評論