色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

MySQL索引下推知識分享

OSC開源社區 ? 來源:OSCHINA 社區 ? 2022-12-27 09:49 ? 次閱讀

作者 | 京東云開發者-劉鄧忠

Mysql 是大家最常用的數據庫,下面為大家帶來 mysql 索引下推知識點的分享,以便鞏固 mysql 基礎知識,如有錯誤,還請各位大佬們指正。

1 什么是索引下推

索引下推 (Index Condition Pushdown,索引條件下推,簡稱 ICP),是 MySQL5.6 版本的新特性,它可以在對聯合索引遍歷過程中,對索引中包含的所有字段先做判斷,過濾掉不符合條件的記錄之后再回表,能有效的減少回表次數(目前我們使用的 mysql 版本較高,一般大家可能感覺這是正常的,但是 mysql5.6 之前都不是這樣實現的,下面會細細道來)。

1.1 適用條件

我們先來了解一下索引下推的使用條件及限制:

只支持 select。

當需要訪問全表時,ICP 用于 range,ref,eq_ref 和 ref_or_null 訪問類型。

ICP 可用于 InnoDB 和 MyISAM 表,包括分區的 InnoDB 和 MyISAM 表。(5.6 版本不適用分區表查詢,5.7 版本后可以用于分區表查詢)。

對于 InnDB 引擎只適用于二級索引(也叫輔助索引),因為 InnDB 的聚簇索引會將整行數據讀到 InnDB 的緩沖區,這樣一來索引條件下推的主要目的減少 IO 次數就失去了意義。因為數據已經在內存中了,不再需要去讀取了。

在虛擬生成列上創建的輔助索引不支持 ICP(注:InnoDB 支持虛擬生成列的輔助索引)。

使用了子查詢的條件無法下推。

使用存儲過程或函數的條件無法下推(因為因為存儲引擎沒有調用存儲過程或函數的能力)。

觸發條件無法下推。(有關觸發條件的信息,請參閱官方資料:Section 8.2.2.3, “Optimizing Subqueries with the EXISTS Strategy”.。)

1.2 原理介紹

首先,我們大致回顧下 mysql 的基本架構:

374cf660-852e-11ed-bfe3-dac502259ad0.png

MySQL 基本的架構示例圖 MySQL 服務層主要負責 SQL 語法解析、生成執行計劃等,并調用存儲引擎層去執行數據的存儲和查詢。

索引下推的下推其含義就是指將部分上層(服務層)負責的事情,交給了下層(引擎層)去處理。

在 MySql 5.6 版本之前沒有索引下推這個功能,從 5.6 版本后才加上了這個優化項。我們先簡單對比一下使用和未使用 ICP 兩種情況下,MySql 的查詢過程吧。

1) 未使用 ICP 的情況下:

- 存儲引擎讀取索引記錄;

- 根據索引中的主鍵值,定位并讀取完整的行記錄;

- 存儲引擎把記錄交給 Server 層去檢測該記錄是否滿足 WHERE 條件。

2) 使用 ICP 的情況下:

- 存儲引擎讀取索引記錄(不是完整的行記錄);

- 判斷 WHERE 條件部分能否用索引中的列來做檢查,條件不滿足,則處理下一行索引記錄;

- 條件滿足,使用索引中的主鍵去定位并讀取完整的行記錄(就是所謂的回表);

- 存儲引擎把記錄交給 Server 層,Server 層檢測該記錄是否滿足 WHERE 條件的其余部分。

2 具體示例

上面介紹了基本原理,下面使用示例,帶大家更直觀的進行理解(注:以下示例基于 InnoDB 存儲引擎。)

首先,我們新建一張用戶表(jxc_user),設置 id 為主鍵索引,并創建聯合索引(name, age)。

376f2da2-852e-11ed-bfe3-dac502259ad0.png

我們先看一下該表主鍵索引的大致結構示例:

37897810-852e-11ed-bfe3-dac502259ad0.png

主鍵索引結構示例圖 然后我們再看一下該表聯合索引的大致結構示例:

37a9d7d6-852e-11ed-bfe3-dac502259ad0.png

聯合索引結構示例圖 如果現在有一個需求,要求檢索出表中名字第一個字是張,而且年齡等于 10 歲的所有用戶。示例 SQL 語句如下:

select id,name,age,tel,addr from jxc_user where name like '張%' and age=10;

根據索引最左匹配原則,上面這個 sql 語句在查索引樹的時候,只能用 “張”,查到第一個滿足條件的記錄:id 為 1。

那接下來我們具體看一下 使用與未使用 ICP 的情況。

2.1 未使用 ICP 的情況

在 MySQL 5.6 之前,存儲引擎根據聯合索引先找到 name like ‘張 %’ 的主鍵 id(1、4),再逐一進行回表掃描,去聚簇索引找到完整的行記錄,返回 server 層,server 層拿到數據后,再根據條件 age=10 對拿到的數據進行篩選。大致的示意圖如下:

37decd1a-852e-11ed-bfe3-dac502259ad0.png

從上圖,可以看到需要回表兩次,存儲引擎并不會去按照 age=10 進行過濾,相當于聯合索引的另一個字段 age 在存儲引擎層沒有發揮作用,比較浪費。

2.2 使用 ICP 的情況

而 MySQL 5.6 以后, 存儲引擎會根據(name,age)聯合索引,找到 name like ‘張 %’,由于聯合索引中包含 age 列,所以存儲引擎直接再聯合索引里按照條件 age=10 進行過濾,然后根據過濾后的數據再依次進行回表掃描。大致的示意圖如下:

3817a1b2-852e-11ed-bfe3-dac502259ad0.png

從上圖,可以看到只是 id=1 的數據,回表了一次。 除此之外我們還可以看一下執行計劃,看到 Extra 一列里 Using index condition,就是用到了索引下推。

3841dafe-852e-11ed-bfe3-dac502259ad0.png

3 控制參數

Mysql 索引下推功能默認是開啟的,可以用系統參數 optimizer_switch 來控制是否開啟。

查看狀態命令:

select @@optimizer_switch;

386779e4-852e-11ed-bfe3-dac502259ad0.png

關閉命令:set optimizer_switch=”index_condition_pushdown=off”;

開啟命令:set optimizer_switch=”index_condition_pushdown=on”;

4 總結

回表操作:當所要查找的字段不在非主鍵索引樹上時,需要通過葉子節點的主鍵值去主鍵索引上獲取對應的行數據,這個過程稱為回表操作。

索引下推:索引下推主要是減少了不必要的回表操作。對于查找出來的數據,先過濾掉不符合條件的,其余的再去主鍵索引樹上查找。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據庫
    +關注

    關注

    7

    文章

    3794

    瀏覽量

    64362
  • MySQL
    +關注

    關注

    1

    文章

    804

    瀏覽量

    26531
  • ICP
    ICP
    +關注

    關注

    0

    文章

    70

    瀏覽量

    12778

原文標題:MySQL索引下推知識分享

文章出處:【微信號:OSC開源社區,微信公眾號:OSC開源社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    #硬聲創作季 【MySQL調優】聚集索引與覆蓋索引索引下推到底是什么

    數據庫MySQL
    Mr_haohao
    發布于 :2022年09月14日 07:35:53

    MySQL索引的創建與刪除

    MySQL——索引技巧以及注意事項
    發表于 10-31 09:27

    詳解mysql索引

    mysql索引簡介
    發表于 04-13 06:50

    mysql索引使用技巧有哪些?

    mysql索引使用技巧
    發表于 05-20 06:09

    基于MySQL索引的壓力測試

    MySQL - 基于索引的壓力測試
    發表于 06-13 07:57

    MySQL索引使用優化和規范

    MySQL - 索引使用優化和規范
    發表于 06-15 16:01

    MySQL索引、事務、視圖介紹

    MySQL--索引、事務、視圖
    發表于 06-15 07:05

    MySQL索引使用原則

    一般來說, MySQL 中的 B-Tree 索引的物理文件大多都是以 Balance Tree 的結構來存儲的,也就是所有實際需要的數據都存放于 Tree 的 Leaf Node(葉子節點) ,而且
    的頭像 發表于 02-11 15:17 ?2715次閱讀
    <b class='flag-5'>MySQL</b><b class='flag-5'>索引</b>使用原則

    MySQL索引的使用問題

    MySQL 在LIKE進行模糊匹配的時候又是如何利用索引的呢?3、MySQL 到底在怎么樣的情況下能夠利用索引進行排序?今天,我將會用一個模型,把這些問題都一一解答,讓你對
    的頭像 發表于 01-06 16:13 ?1605次閱讀

    關于MySQL索引的分類與原理及本質解析

    索引,可能讓好很多人望而生畏,畢竟每次面試時候 MySQL索引一定是必問內容,哪怕先撇開面試,就在平常的開發中,對于 SQL 的優化也而是重中之重。
    的頭像 發表于 04-03 11:56 ?1615次閱讀
    關于<b class='flag-5'>MySQL</b>中<b class='flag-5'>索引</b>的分類與原理及本質解析

    一百道關于MySQL索引解答

    數據庫 1. MySQL索引使用有哪些注意事項呢? 可以從三個維度回答這個問題:索引哪些情況會失效,索引不適合哪些場景,索引規則
    的頭像 發表于 06-13 15:51 ?2093次閱讀

    MySQL高級進階:索引優化

    MySQL官方對于索引的定義:索引是幫助MySQL高效獲取數據的數據結構。
    的頭像 發表于 06-11 11:13 ?569次閱讀
    <b class='flag-5'>MySQL</b>高級進階:<b class='flag-5'>索引</b>優化

    MySQL索引的常用知識

    索引結構:B+樹 索引其實是一種數據結構 注意B+樹是MySQL索引默認的結構;一張表至少有一個索引(主鍵
    的頭像 發表于 09-30 16:43 ?455次閱讀

    導致MySQL索引失效的情況以及相應的解決方法

    導致MySQL索引失效的情況以及相應的解決方法? MySQL索引的目的是提高查詢效率,但有些情況下索引可能會失效,導致查詢變慢或效果不如預期
    的頭像 發表于 12-28 10:01 ?752次閱讀

    一文了解MySQL索引機制

    接觸MySQL數據庫的小伙伴一定避不開索引索引的出現是為了提高數據查詢的效率,就像書的目錄一樣。 某一個SQL查詢比較慢,你第一時間想到的就是“給某個字段加個索引吧”,那么
    的頭像 發表于 07-25 14:05 ?283次閱讀
    一文了解<b class='flag-5'>MySQL</b><b class='flag-5'>索引</b>機制
    主站蜘蛛池模板: 久久伊人在| 国产免费啪嗒啪嗒视频看看| 9位美女厕所撒尿11分| 99re精品视频在线播放视频| 99精品观看| 二级特黄绝大片免费视频大片| 国产精品免费大片一区二区| 国产亚洲精品久久久久苍井松| 精品国产90后在线观看| 久啪久久全部视频在线| 欧美日韩精品| 忘忧草在线影院WWW日本二| 亚洲精品久久久久一区二区三| 最近日本免费观看MV免费| seyeye高清视频在线| 国产美女影院| 久久亚洲网站| 日本中文一区| 亚洲精品伊人久久久久| 4438成人情人网站| 国产成人精品免费青青草原app| 国产欧美一区二区三区免费| 久久66热在线视频精品| 免费精品国偷自产在线| 久久久久国产| 日本理论片午午伦夜理片2021| 性感尼姑风流寺| 在线观看插女生免费版| 777久久人妻少妇嫩草AV蜜桃| 富婆大保健嗷嗷叫普通话对白| 国产婷婷色一区二区三区在线| 捆绑调教网站| 日韩免费一区| 在线播放免费人成视频| 边做边爱免费视频播放| 国产亚洲一区二区三区啪| 精品一品国产午夜福利视频| 麻豆精品2021最新| 色欲AV精品人妻一二三区| 一级毛片免费视频网站| 风车动漫(p)_在线观看官网|