自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一分鐘帶你學(xué)會(huì)MySQL覆蓋索引,讓你的SQL更高效

數(shù)據(jù)庫(kù) MySQL
在我們查詢(xún)SQL時(shí),我們不僅要考慮where條件是否匹配了索引,還要盡量考慮查詢(xún)的字段是否可以通過(guò)索引直接獲取,覆蓋索引可以減少樹(shù)的搜索次數(shù),顯著的提升SQL查詢(xún)性能。

覆蓋索引是MySQL優(yōu)化sql性能的一種非常重要而且常用的手段,通過(guò)覆蓋索引,我們可以直接查詢(xún)到需要的結(jié)果,而不用回表,從而大大減少樹(shù)的搜索次數(shù),非常明顯的提升查詢(xún)性能。

數(shù)據(jù)如何存儲(chǔ)與查找

我們知道,MySQL的數(shù)據(jù)都是存儲(chǔ)在B+樹(shù)上的,每一個(gè)索引都代表一個(gè)B+樹(shù)。

對(duì)于主鍵索引,葉子節(jié)點(diǎn)存儲(chǔ)的是一行記錄的所有字段值(邏輯上),而非主鍵索引的葉子節(jié)點(diǎn)存儲(chǔ)的是主鍵值,非葉子節(jié)點(diǎn)存儲(chǔ)的是索引以及指向數(shù)據(jù)的指針。

那我們查詢(xún)數(shù)據(jù)的時(shí)候,MySQL是如何執(zhí)行的呢?

以主鍵索引為例,就是在主鍵索引樹(shù)上,從根節(jié)點(diǎn)出發(fā),一直向下查找,直到找到符合條件的記錄。

如果我們要查下圖中的User2節(jié)點(diǎn),那么查找路徑就是UserA->UserC->UserF->User2。

回表

只按照主鍵查詢(xún)是一種理想中的狀態(tài),隨著業(yè)務(wù)逐漸復(fù)雜,表中的字段會(huì)越來(lái)越多,我們也會(huì)建立更多的非主鍵索引以應(yīng)對(duì)業(yè)務(wù)帶來(lái)的挑戰(zhàn)。

但是非主鍵索引會(huì)帶來(lái)一個(gè)問(wèn)題:回表。

以下面這條sql為例:

select * from t where m in (3,4);

我們?cè)诒韙的m字段上設(shè)置一個(gè)索引,那么這條sql的執(zhí)行流程就是:

  1. 在索引樹(shù)m上,找到記錄3,獲取到主鍵id,比如id=100;
  2. 拿著100這個(gè)id去主鍵索引樹(shù)上,獲取到這一行的數(shù)據(jù);
  3. 在索引樹(shù)m上,找到記錄4,獲取到主鍵id,比如id=101;
  4. 拿著101這個(gè)id去主鍵索引樹(shù)上,獲取到這一行的數(shù)據(jù);
  5. 在索引樹(shù)上查找下一個(gè)記錄5(不一定是5,這里的5只是代表記錄4后面的一條記錄),記錄5不符合查詢(xún)條件,結(jié)束查詢(xún)。

在上面的流程中,步驟2,4代表了回主鍵索引樹(shù)搜索,這個(gè)動(dòng)作就叫做回表。

而MySQL之所以做回表這個(gè)動(dòng)作,是因?yàn)槲覀円榈臄?shù)據(jù) select *,只有在主鍵索引樹(shù)上才有,所以不得不回表查詢(xún)。

覆蓋索引

如果我們把上面的sql改成下面這樣:

select id from t where m in (3,4);

這個(gè)時(shí)候只需要查詢(xún)id就行,而id這個(gè)值已經(jīng)在m索引樹(shù)上了,這時(shí)就不用再回表了,可以直接提供查詢(xún)結(jié)果。

可以說(shuō),索引m覆蓋了我們的查詢(xún)請(qǐng)求,這種情況我們就稱(chēng)為覆蓋索引。

這也是為什么我們?cè)诤芏郙ySQL規(guī)范中可以看到,要求我們查詢(xún)數(shù)據(jù)時(shí)盡量避免"select *",就是因?yàn)?select *"會(huì)導(dǎo)致覆蓋索引失效,從而引起強(qiáng)制回表,sql性能可能大幅下降。

最后

在我們查詢(xún)SQL時(shí),我們不僅要考慮where條件是否匹配了索引,還要盡量考慮查詢(xún)的字段是否可以通過(guò)索引直接獲取,覆蓋索引可以減少樹(shù)的搜索次數(shù),顯著的提升SQL查詢(xún)性能。

責(zé)任編輯:姜華 來(lái)源: 今日頭條
相關(guān)推薦

2015-11-12 10:32:40

GitHub控制系統(tǒng)分布式

2017-07-06 08:12:02

索引查詢(xún)SQL

2016-09-12 17:28:45

云存儲(chǔ)應(yīng)用軟件存儲(chǔ)設(shè)備

2017-03-30 19:28:26

HBase分布式數(shù)據(jù)

2019-02-28 15:04:36

顯卡兼容芯片

2022-06-02 08:46:04

網(wǎng)卡網(wǎng)絡(luò)服務(wù)器

2025-01-20 13:30:00

Linux系統(tǒng)Ansible

2018-07-31 16:10:51

Redo Undo數(shù)據(jù)庫(kù)數(shù)據(jù)

2017-02-21 13:00:27

LoadAverage負(fù)載Load

2020-05-21 19:46:19

區(qū)塊鏈數(shù)字貨幣比特幣

2018-06-26 05:23:19

線(xiàn)程安全函數(shù)代碼

2022-07-18 06:16:07

單點(diǎn)登錄系統(tǒng)

2011-02-21 17:48:35

vsFTPd

2018-08-17 07:19:34

網(wǎng)絡(luò)故障硬件軟件

2018-12-12 22:51:24

Java包裝語(yǔ)言

2020-07-09 07:37:06

數(shù)據(jù)庫(kù)Redis工具

2020-07-17 07:44:25

云計(jì)算邊緣計(jì)算IT

2021-09-28 14:02:19

電腦主板黑屏

2023-03-10 13:29:00

MySQLCount函數(shù)

2016-12-16 11:05:00

分布式互斥線(xiàn)程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)