日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

在《MySQL 常見語句加鎖分析》一文中,我們詳細(xì)講解了 SQL 語句的加鎖原理并具體分析了大部分的簡單 SQL 語句,但是實(shí)際業(yè)務(wù)場景中 SQL 語句往往及其復(fù)雜,包含多個(gè)條件,此時(shí)就需要具體分析SQL 使用到的索引,并了解 where 條件的判斷邏輯。

我們可以直接使用 explain 或者 optimizer_trace 來分析 SQL 語句執(zhí)行使用了哪些索引,具體使用可以看本系列文章的前兩篇文章。但是,今天我們講一下具體 Where 語句的條件的拆分和使用,即復(fù)雜 Where 條件是如何生效的。

用何登成大神的原話,就是

給定一條SQL,where條件中的每個(gè)子條件,在SQL執(zhí)行的過程中分別起著什么樣的作用?

具體場景

我們使用下面這張 book 表作為實(shí)例,其中 id 為主鍵,ISBN(書號)為二級唯一索引,Author(作者)為二級非唯一索引,score(評分)無索引。

MySQL復(fù)雜where條件分析

 

Index Key 和 Table Filter

基于上述表,我們具體分析一下如下?lián)碛袕?fù)雜 Where 條件的 SQL 語句。

mysql> UPDATE book SET score = 9.0 WHERE Author = 'Tom' AND ISBN > 'N0004' AND ISBN < 'N0007';

上述 SQL 語句的 Where 條件使用了兩個(gè)索引,分別是二級唯一索引 ISBN 和二級非唯一索引 Author。MySQL 會根據(jù)索引選擇性等指標(biāo)選擇其中一個(gè)索引來使用,而另外一個(gè)沒有被使用的 Where 條件就被當(dāng)做普通的過濾條件,一般稱被用到的索引稱為 Index Key,而作為普通過濾的條件則被稱為 Table Filter。比如上面這條SQL 使用 ISBN索引來查詢,則 ISBN 就是 Index Key,而 Author = 'Tom' 這個(gè)條件就是 Table Filter。

所以,該 SQL 執(zhí)行的過程就是依次將 Index Key 范圍內(nèi)的索引記錄讀取,然后回表讀取完整數(shù)據(jù)記錄,然后返回給MySQL的服務(wù)層按照 Table Filter 進(jìn)行過濾。 至于加鎖,如下圖所示則需要將涉及的 Index Key 對應(yīng)的索引記錄都進(jìn)行加鎖。

MySQL復(fù)雜where條件分析

 

但是當(dāng)使用的索引是復(fù)合索引時(shí),則還可能出現(xiàn) Index Filter,利用它可以減少回表次數(shù)和返回給 MySQL 服務(wù)層的記錄的數(shù)量,降低存儲引擎和服務(wù)層的交互開銷,提高 SQL 的執(zhí)行效率。

Index Filter

假設(shè)我們在 book 表的 ISBN 和 Author 列上建立了聯(lián)合索引,并且上述 SQL 執(zhí)行時(shí)選擇了該復(fù)合索引。

對于這個(gè)場景,MySQL 依然使用 ISBN > 'N0004' AND ISBN < 'N0007' 條件來確定 SQL 查詢在索引中的連續(xù)位置,但是 Author = 'Tom' 可以用來直接過濾索引,即該條件可以使用復(fù)合索引來直接過濾條件,不需要讀取所有數(shù)據(jù)后由MySQL 服務(wù)層根據(jù) Table Filter 來過濾。這就是傳說中的 ICP(Index Condition Pushdown,索引下推)技術(shù),使用 Index Filter 過濾不滿足條件的記錄,無需加鎖。

MySQL復(fù)雜where條件分析

 

根據(jù) Index Key 判斷查詢返回和根據(jù) Index Filter 進(jìn)行初步過濾后,存儲引擎將剩下的數(shù)據(jù)記錄返回給服務(wù)層,再由服務(wù)層根據(jù) Table Filter 進(jìn)行過濾。

ICP (索引下推)技術(shù)

MySQL 5.6 推出的 ICP 技術(shù)其實(shí)就是 Index Filter 技術(shù),只不過是因?yàn)?MySQL 分為服務(wù)層和存儲引擎層,而 Index Filter 將原本服務(wù)層做的過濾操作“下推”到存儲引擎層處理。將原來的在服務(wù)層進(jìn)行的Table Filter中可以進(jìn)行Index Filter的部分,在引擎層面使用 Index Filter 進(jìn)行處理,不再需要回表進(jìn)行 Table Filter。

這樣做的好處就是減少了加鎖的記錄數(shù),減少了回表查詢的數(shù)量,提高了 SQL 的執(zhí)行效率。

終于要到系列的最后一篇了,下一篇,我們將講解如何根據(jù) MySQL 信息判斷死鎖和解決死鎖。請大家關(guān)注,轉(zhuǎn)發(fā)和點(diǎn)贊三連走起。

分享到:
標(biāo)簽:MySQL
用戶無頭像

網(wǎng)友整理

注冊時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定