中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL索引下推是什么意思

發布時間:2021-09-15 19:58:40 來源:億速云 閱讀:221 作者:chen 欄目:開發技術

這篇文章主要介紹“MySQL索引下推是什么意思”,在日常操作中,相信很多人在MySQL索引下推是什么意思問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”MySQL索引下推是什么意思”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

目錄
  • 一、索引下推優化的原理

  • 二、索引下推的具體實踐

    • 1、沒有使用ICP

    • 2、使用ICP

  • 三、索引下推使用條件

    索引下推(Index Condition Pushdown,簡稱ICP),是MySQL5.6版本的新特性,它能減少回表查詢次數,提高查詢效率。

    一、索引下推優化的原理

    我們先簡單了解一下MySQL大概的架構:

    MySQL索引下推是什么意思

    MySQL服務層負責SQL語法解析、生成執行計劃等,并調用存儲引擎層去執行數據的存儲和檢索。

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

    我們來具體看一下,在沒有使用ICP的情況下,MySQL的查詢:

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

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

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

    使用ICP的情況下,查詢過程:

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

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

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

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

    二、索引下推的具體實踐

    理論比較抽象,我們來上一個實踐。

    使用一張用戶表tuser,表里創建聯合索引(name, age)。

    MySQL索引下推是什么意思

    如果現在有一個需求:檢索出表中名字第一個字是張,而且年齡是10歲的所有用戶。那么,SQL語句是這么寫的:

    select * from tuser where name like '張%' and age=10;

    假如你了解索引最左匹配原則,那么就知道這個語句在搜索索引樹的時候,只能用 ,找到的第一個滿足條件的記錄id為1。

    MySQL索引下推是什么意思

    那接下來的步驟是什么呢?

    1、沒有使用ICP

    MySQL 5.6之前,存儲引擎根據通過聯合索引找到name like '張%' 的主鍵id(1、4),逐一進行回表掃描,去聚簇索引找到完整的行記錄,server層再對數據根據age=10進行篩選。

    我們看一下示意圖:

    MySQL索引下推是什么意思

    可以看到需要回表兩次,把我們聯合索引的另一個字段age浪費了。

    2、使用ICP

    MySQL 5.6 以后, 存儲引擎根據(nameage)聯合索引,找到name like '張%',由于聯合索引中包含age列,所以存儲引擎直接再聯合索引里按照age=10過濾。按照過濾后的數據再一一進行回表掃描。

    我們看一下示意圖:

     MySQL索引下推是什么意思

    可以看到只回表了一次。

    除此之外我們還可以看一下執行計劃,看到Extra一列里 Using index condition,這就是用到了索引下推。

    +----+-------------+-------+------------+-------+---------------+----------+---------+------+------+----------+-----------------------+
    | id | select_type | table | partitions | type  | possible_keys | key      | key_len | ref  | rows | filtered | Extra                 |
    +----+-------------+-------+------------+-------+---------------+----------+---------+------+------+----------+-----------------------+
    |  1 | SIMPLE      | tuser | NULL       | range | na_index      | na_index | 102     | NULL |    2 |    25.00 | Using index condition |
    +----+-------------+-------+------------+-------+---------------+----------+---------+------+------+----------+-----------------------+

    三、索引下推使用條件

    • 只能用于rangerefeq_refref_or_null訪問方法;

    • 只能用于InnoDBMyISAM存儲引擎及其分區表;

    • InnoDB存儲引擎來說,索引下推只適用于二級索引(也叫輔助索引);

    索引下推的目的是為了減少回表次數,也就是要減少IO操作。對于InnoDB的聚簇索引來說,數據和索引是在一起的,不存在回表這一說。

    • 引用了子查詢的條件不能下推;

    • 引用了存儲函數的條件不能下推,因為存儲引擎無法調用存儲函數。

    相關系統參數:

    索引條件下推默認是開啟的,可以使用系統參數optimizer_switch來控制器是否開啟。

    查看默認狀態:

    mysql> select @@optimizer_switch\G;
    *************************** 1. row ***************************
    @@optimizer_switch: index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on
    1 row in set (0.00 sec)

    切換狀態:

    set optimizer_switch="index_condition_pushdown=off";
    set optimizer_switch="index_condition_pushdown=on";

    到此,關于“MySQL索引下推是什么意思”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    和田市| 宁城县| 治多县| 台州市| 洛扎县| 搜索| 当雄县| 丘北县| 绥江县| 南岸区| 隆安县| 民丰县| 赣州市| 林周县| 普兰店市| 福海县| 中方县| 遵义市| 新沂市| 师宗县| 曲麻莱县| 明星| 汾西县| 河津市| 邹平县| 光山县| 宝丰县| 永顺县| 沁水县| 玉树县| 自治县| 嘉义县| 冷水江市| 博白县| 林西县| 娱乐| 邻水| 禹州市| 英吉沙县| 台江县| 南皮县|