最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL帶你秒懂索引下推

 更新時間:2021年09月15日 16:48:38   作者:三分惡  
如果你在面試中,聽到MySQL5.6”、“索引優(yōu)化” 之類的詞語,你就要立馬get到,這個問的是“索引下推”。本文就來分分享這個小知識點索引下推

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

一、索引下推優(yōu)化的原理

我們先簡單了解一下MySQL大概的架構(gòu):

MySQL服務(wù)層負(fù)責(zé)SQL語法解析、生成執(zhí)行計劃等,并調(diào)用存儲引擎層去執(zhí)行數(shù)據(jù)的存儲和檢索。

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

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

  • 存儲引擎讀取索引記錄;
  • 根據(jù)索引中的主鍵值,定位并讀取完整的行記錄;
  • 存儲引擎把記錄交給Server層去檢測該記錄是否滿足WHERE條件。

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

  • 存儲引擎讀取索引記錄(不是完整的行記錄);
  • 判斷WHERE條件部分能否用索引中的列來做檢查,條件不滿足,則處理下一行索引記錄;
  • 條件滿足,使用索引中的主鍵去定位并讀取完整的行記錄(就是所謂的回表);
  • 存儲引擎把記錄交給Server層,Server層檢測該記錄是否滿足WHERE條件的其余部分。

二、索引下推的具體實踐

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

使用一張用戶表tuser,表里創(chuàng)建聯(lián)合索引(name, age)。

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

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


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

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

1、沒有使用ICP

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

我們看一下示意圖:

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

2、使用ICP

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

我們看一下示意圖:

可以看到只回表了一次。

除此之外我們還可以看一下執(zhí)行計劃,看到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 |
+----+-------------+-------+------------+-------+---------------+----------+---------+------+------+----------+-----------------------+

三、索引下推使用條件

  • 只能用于range、 ref、 eq_ref、ref_or_null訪問方法;
  • 只能用于InnoDBMyISAM存儲引擎及其分區(qū)表;
  • InnoDB存儲引擎來說,索引下推只適用于二級索引(也叫輔助索引);

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

  • 引用了子查詢的條件不能下推;
  • 引用了存儲函數(shù)的條件不能下推,因為存儲引擎無法調(diào)用存儲函數(shù)。

相關(guān)系統(tǒng)參數(shù):

索引條件下推默認(rèn)是開啟的,可以使用系統(tǒng)參數(shù)optimizer_switch來控制器是否開啟。

查看默認(rèn)狀態(tài):

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)

切換狀態(tài):

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

到此這篇關(guān)于幾分鐘搞懂MySQL索引下推的文章就介紹到這了,更多相關(guān)MySQL索引下推內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于mysql中innodb的count優(yōu)化問題分享

    關(guān)于mysql中innodb的count優(yōu)化問題分享

    關(guān)于mysql中innodb的count優(yōu)化問題,有需要的朋友可以參考下
    2013-02-02
  • MySQL的雙寫緩沖區(qū)Doublewrite Buffer詳解

    MySQL的雙寫緩沖區(qū)Doublewrite Buffer詳解

    這篇文章主要介紹了MySQL的雙寫緩沖區(qū)Doublewrite Buffer詳解,InnoDB是MySQL中一種常用的事務(wù)性存儲引擎,它具有很多優(yōu)秀的特性,其中,Doublewrite Buffer是InnoDB的一個重要特性之一,本文將介紹Doublewrite Buffer的原理和應(yīng)用,需要的朋友可以參考下
    2023-07-07
  • mysql 8.0.19 winx64.zip安裝教程

    mysql 8.0.19 winx64.zip安裝教程

    這篇文章主要為大家詳細(xì)介紹了mysql 8.0.19 winx64.zip安裝教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • mysql執(zhí)行計劃Explain解讀

    mysql執(zhí)行計劃Explain解讀

    在數(shù)據(jù)庫操作中,理解Explain執(zhí)行計劃對于性能優(yōu)化至關(guān)重要,Explain展示了MySQL如何執(zhí)行查詢,包括選擇哪些索引,如何連接表,以及估計的行數(shù)等,Select類型、訪問表的方式、使用的索引、以及額外的執(zhí)行信息,都是優(yōu)化查詢時需要考慮的因素
    2024-10-10
  • 兩個windows服務(wù)器使用canal實現(xiàn)mysql實時同步

    兩個windows服務(wù)器使用canal實現(xiàn)mysql實時同步

    canal是阿里基于java寫的一個組件,他的作用是canal.deployer讀取mysql數(shù)據(jù)的binlog日志,然后canal.adapter將其轉(zhuǎn)換為對應(yīng)的數(shù)據(jù)(數(shù)據(jù)的變化或者變化后的數(shù)據(jù),跟配置有關(guān)),并且同步到相關(guān)中間件,本文實現(xiàn)兩個windows服務(wù)器使用canal實現(xiàn)mysql主從復(fù)制實時同步
    2025-03-03
  • MySQL如何解決DOS窗口亂碼問題

    MySQL如何解決DOS窗口亂碼問題

    這篇文章主要介紹了MySQL如何解決DOS窗口亂碼問題,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2020-11-11
  • Navicat導(dǎo)入導(dǎo)出Mysql?結(jié)構(gòu)、數(shù)據(jù)、結(jié)構(gòu)+數(shù)據(jù)完整步驟

    Navicat導(dǎo)入導(dǎo)出Mysql?結(jié)構(gòu)、數(shù)據(jù)、結(jié)構(gòu)+數(shù)據(jù)完整步驟

    導(dǎo)出表結(jié)構(gòu)是指將數(shù)據(jù)庫中的表的結(jié)構(gòu)信息導(dǎo)出為SQL腳本或其他格式的文件,這個功能非常實用,特別是在數(shù)據(jù)庫遷移或備份時,這篇文章主要給大家介紹了關(guān)于Navicat導(dǎo)入導(dǎo)出Mysql?結(jié)構(gòu)、數(shù)據(jù)、結(jié)構(gòu)+數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2024-08-08
  • 基于JPQL實現(xiàn)純SQL語句方法詳解

    基于JPQL實現(xiàn)純SQL語句方法詳解

    這篇文章主要介紹了基于JPQL實現(xiàn)純SQL語句方法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • 計算機(jī)管理服務(wù)中找不到mysql的服務(wù)的解決辦法

    計算機(jī)管理服務(wù)中找不到mysql的服務(wù)的解決辦法

    MySQL是一種流行的開源關(guān)系型數(shù)據(jù)庫管理系統(tǒng),用于存儲和管理大量數(shù)據(jù),在計算機(jī)管理中,啟動MySQL服務(wù)是一項重要的任務(wù),因為它可以確保數(shù)據(jù)庫系統(tǒng)的順利運行,這篇文章主要給大家介紹了關(guān)于計算機(jī)管理服務(wù)中找不到mysql的服務(wù)的解決辦法,需要的朋友可以參考下
    2023-05-05
  • mysql索引基數(shù)概念與用法示例

    mysql索引基數(shù)概念與用法示例

    這篇文章主要介紹了mysql索引基數(shù)概念與用法,結(jié)合實例形式分析了mysql索引基數(shù)的相關(guān)概念、原理、操作命令及相關(guān)使用技巧,需要的朋友可以參考下
    2019-03-03

最新評論

平凉市| 汾阳市| 西林县| 新巴尔虎左旗| 郎溪县| 富平县| 吴堡县| 武强县| 肃宁县| 武安市| 杂多县| 日照市| 河间市| 井陉县| 琼海市| 霍林郭勒市| 扎兰屯市| 吴堡县| 汪清县| 苍溪县| 天等县| 平泉县| 崇仁县| 英吉沙县| 嘉禾县| 南丹县| 应用必备| 闵行区| 彭山县| 威信县| 洛扎县| 浑源县| 灵武市| 大关县| 临桂县| 长寿区| 阿拉善左旗| 庄河市| 深水埗区| 寿宁县| 阿克|