日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
好的索引當(dāng)然是要覆蓋了!

如果你的查詢中用到了索引,這是一個(gè)進(jìn)步,如果能夠更進(jìn)一步,用到了覆蓋索引,那么就更牛了!當(dāng)我們?cè)O(shè)計(jì)一個(gè)索引的時(shí)候,如果能夠從一個(gè)更加全面的角度去設(shè)計(jì)這個(gè)索引,不僅考慮到 where 中的條件,還能夠考慮到整個(gè) SQL,那么無(wú)疑這個(gè)索引的設(shè)計(jì)將是非常成功的。

創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供金沙網(wǎng)站建設(shè)、金沙做網(wǎng)站、金沙網(wǎng)站設(shè)計(jì)、金沙網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、金沙企業(yè)網(wǎng)站模板建站服務(wù),10余年金沙做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

當(dāng)然不能為了覆蓋而覆蓋。

1. 什么是覆蓋索引

要理解什么是覆蓋索引,我們需要先來(lái)回顧一下 InnoDB 中索引樹(shù)的數(shù)據(jù)結(jié)構(gòu)。

假設(shè)我有如下數(shù)據(jù):

id(主鍵)

username

age

address

gender

1

ab

99

深圳

2

bw

95

天津

3

cx

93

深圳

4

bc

80

上海

5

bg

85

重慶

6

ac

98

廣州

7

bw

99

???/p>

8

ck

90

深圳

9

cc

92

武漢

10

af

88

北京

現(xiàn)在我給 username、age 以及 address 三個(gè)字段建立一個(gè)聯(lián)合索引,那么這個(gè)聯(lián)合索引的 B+Tree 可能是這個(gè)樣子:

上面這個(gè)索引樹(shù)是一個(gè)非聚集索引或者也可以說(shuō)是一個(gè)二級(jí)索引,這種索引區(qū)別于我們之前文章跟大家聊的聚集索引(再聊 MySQL 聚簇索引),在聚集索引中,葉子結(jié)點(diǎn)就是這一行的數(shù)據(jù),但是在二級(jí)索引中,葉子結(jié)點(diǎn)中保存的是主鍵值。

所以,當(dāng)我們搜索的時(shí)候,如果使用的是二級(jí)索引,那么最終拿到的是主鍵值,有了主鍵值之后,我們還需要再去到聚簇索引中進(jìn)行搜索,才能拿到完整的數(shù)據(jù),這個(gè)過(guò)程我們也稱之為回表。

很明顯,如果進(jìn)行了回表操作的話,那么執(zhí)行效率顯然就要下降一截,那么是否用到了二級(jí)索引就會(huì)回表呢?其實(shí)不然!如果是覆蓋索引的話,就不需要回表。

那么什么是覆蓋索引呢?

小伙伴們觀察上面的索引樹(shù),大家發(fā)現(xiàn)在這個(gè)索引樹(shù)中,離葉子結(jié)點(diǎn)最近的樹(shù)枝上有 username、age 以及 address,而葉子結(jié)點(diǎn)上有 id,所以如果我想要查詢的字段是 id、username、age 以及 address 中的任意一個(gè)或者任意幾個(gè)的話,那么就不需要再去聚簇索引上查詢了,當(dāng)前這個(gè) B+Tree 上直接就有現(xiàn)成的,直接返回即可,這個(gè)就是覆蓋索引。

2. 實(shí)踐

現(xiàn)在假設(shè)我有如下一張表:

CREATE TABLE `user` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `age` int DEFAULT NULL,
  `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `gender` varchar(2) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `user_prop_index` (`username`,`age`,`address`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

可以看到,這張表中有一個(gè)名為 user_prop_index 的索引,這個(gè)索引中一共存在三個(gè)字段,分別是 username、age 以及 address,現(xiàn)在我們來(lái)看如下 SQL 的執(zhí)行計(jì)劃:

explain select address from user where username='ab' and age=99\G

小伙伴們看到,Extra: Using index 就表示使用到了覆蓋索引,因?yàn)槲业牟樵?SQL 中最終想要的值,都在當(dāng)前這棵索引樹(shù)上。

更進(jìn)一步,假設(shè)我要查詢 id、address 以及 age 字段,如下:

explain select id,address,age from user where username='ab'\G

很明顯,由于這三個(gè)字段都在索引樹(shù)上,所以直接直接通過(guò)回表獲取到。

但是,如果想直接 select *,那么由于這個(gè)索引樹(shù)上沒(méi)有 gender 字段,此時(shí)就必須要回表才能拿到 gender 字段的值,如下:

explain select * from user where username='ab'\G

可以看到,這個(gè)時(shí)候沒(méi)有用到覆蓋索引了。

3. 覆蓋索引的優(yōu)勢(shì)

通過(guò)前面的介紹,覆蓋索引的優(yōu)勢(shì)相信小伙伴們也能自己總結(jié)出來(lái):

  1. 覆蓋索引不需要回表,直接在 B+Tree 這顆索引樹(shù)上就能讀取到需要的數(shù)據(jù),這極大的減少了數(shù)據(jù)庫(kù) IO 次數(shù),在 IO 密集型應(yīng)用中,這樣的性能提升非常有效。
  2. 基于 B+Tree 中聯(lián)合索引數(shù)據(jù)的排序規(guī)則,覆蓋索引中,如果涉及到范圍搜索,也是非常高效的(如果涉及到回表的話,效率就會(huì)降低很多)。

本文名稱:好的索引當(dāng)然是要覆蓋了!
本文網(wǎng)址:http://www.5511xx.com/article/dphjcoh.html