濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > mysql利用覆蓋索引避免回表優(yōu)化查詢

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

熱門標(biāo)簽:曲靖移動(dòng)外呼系統(tǒng)公司 百應(yīng)電話機(jī)器人優(yōu)勢(shì) 怎樣在地圖標(biāo)注銷售區(qū)域 地圖標(biāo)注費(fèi)用是多少 啥是企業(yè)400電話辦理 南昌三維地圖標(biāo)注 電話外呼系統(tǒng)改號(hào) 外呼系統(tǒng)打電話上限是多少 武漢網(wǎng)絡(luò)外呼系統(tǒng)服務(wù)商

前言

說(shuō)到覆蓋索引之前,先要了解它的數(shù)據(jù)結(jié)構(gòu):B+樹(shù)。

先建個(gè)表演示(為了簡(jiǎn)單,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

 以主鍵以外的列值作為鍵值構(gòu)建的 B+ 樹(shù)索引,我們稱之為非聚集索引。

非聚集索引與聚集索引的區(qū)別在于非聚集索引的葉子節(jié)點(diǎn)不存儲(chǔ)表中的數(shù)據(jù),而是存儲(chǔ)該列對(duì)應(yīng)的主鍵,想要查找數(shù)據(jù)我們還需要根據(jù)主鍵再去聚集索引中進(jìn)行查找,這個(gè)再根據(jù)聚集索引查找數(shù)據(jù)的過(guò)程,我們稱為回表。

B+樹(shù)

B+樹(shù)和B樹(shù)是mysql索引的常用數(shù)據(jù)結(jié)構(gòu),B+樹(shù)是B樹(shù)的進(jìn)一步優(yōu)化,將上面的表轉(zhuǎn)成圖分析一下:

B+樹(shù)的特點(diǎn):

1.B+ 樹(shù)非葉子節(jié)點(diǎn)上是不存儲(chǔ)數(shù)據(jù)的,僅存儲(chǔ)鍵值

2.葉子節(jié)點(diǎn)的數(shù)據(jù)是按照順序排列的

3. B+ 樹(shù)中各個(gè)頁(yè)之間是通過(guò)雙向鏈表連接

聚簇索引和非聚簇索引

B+ 樹(shù)索引按照存儲(chǔ)方式的不同分為聚集索引和非聚集索引。

聚簇索引:

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

這是因?yàn)?InnoDB 是把數(shù)據(jù)存放在 B+ 樹(shù)中的,而 B+ 樹(shù)的鍵值就是主鍵,在 B+ 樹(shù)的葉子節(jié)點(diǎn)中,存儲(chǔ)了表中所有的數(shù)據(jù)。

這種以主鍵作為 B+ 樹(shù)索引的鍵值而構(gòu)建的 B+ 樹(shù)索引,我們稱之為聚集索引。

非聚簇索引:

以主鍵以外的列值作為鍵值構(gòu)建的 B+ 樹(shù)索引,我們稱之為非聚集索引。

非聚集索引與聚集索引的區(qū)別在于非聚集索引的葉子節(jié)點(diǎn)不存儲(chǔ)表中的數(shù)據(jù),而是存儲(chǔ)該列對(duì)應(yīng)的主鍵,想要查找數(shù)據(jù)我們還需要根據(jù)主鍵再去聚集索引中進(jìn)行查找,這個(gè)再根據(jù)聚集索引查找數(shù)據(jù)的過(guò)程,我們稱為回表。

如何用覆蓋索引避免回表

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

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

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é)點(diǎn)存儲(chǔ)了主鍵id,通過(guò)name的索引樹(shù)即可獲取id和name,無(wú)需回表,符合索引覆蓋,效率較高。

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

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

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

總結(jié)

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

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

標(biāo)簽:錦州 吉林 資陽(yáng) 滄州 黑河 甘南 隨州 荊州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《mysql利用覆蓋索引避免回表優(yōu)化查詢》,本文關(guān)鍵詞  mysql,利用,覆蓋,索引,避免,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《mysql利用覆蓋索引避免回表優(yōu)化查詢》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于mysql利用覆蓋索引避免回表優(yōu)化查詢的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    大厂| 习水县| 武汉市| 永州市| 阳春市| 息烽县| 奎屯市| 惠水县| 旌德县| 盐山县| 玉林市| 台南市| 南城县| 灵武市| 怀远县| 格尔木市| 安义县| 建水县| 汉沽区| 牡丹江市| 新龙县| 浮山县| 颍上县| 金昌市| 静宁县| 山阴县| 扬中市| 东港市| 沂南县| 晋江市| 青河县| 习水县| 兴安县| 屏南县| 英超| 略阳县| 德州市| 阿拉善左旗| 高陵县| 黄大仙区| 垣曲县|