亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

五分鐘帶你搞懂MySQL索引下推

 更新時(shí)間:2021年09月09日 15:48:24   作者:三分惡  
這篇文章主要介紹了Mysql的索引下推,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

如果你在面試中,聽(tīng)到MySQL5.6”、“索引優(yōu)化” 之類的詞語(yǔ),你就要立馬get到,這個(gè)問(wèn)的是“索引下推”。

什么是索引下推

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

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

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

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

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

我們來(lái)具體看一下,在沒(méi)有使用ICP的情況下,MySQL的查詢:

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

使用ICP的情況下,查詢過(guò)程:

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

索引下推的具體實(shí)踐

理論比較抽象,我們來(lái)上一個(gè)實(shí)踐。

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

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

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

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

那接下來(lái)的步驟是什么呢?

沒(méi)有使用ICP

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

我們看一下示意圖:

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

使用ICP

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

我們看一下示意圖:

可以看到只回表了一次。

除此之外我們還可以看一下執(zhí)行計(jì)劃,看到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訪問(wèn)方法;
  • 只能用于InnoDB和 MyISAM存儲(chǔ)引擎及其分區(qū)表;
  • 對(duì)InnoDB存儲(chǔ)引擎來(lái)說(shuō),索引下推只適用于二級(jí)索引(也叫輔助索引);

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

  • 引用了子查詢的條件不能下推;
  • 引用了存儲(chǔ)函數(shù)的條件不能下推,因?yàn)榇鎯?chǔ)引擎無(wú)法調(diào)用存儲(chǔ)函數(shù)。

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

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

查看默認(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";

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • mysql中rpm方式安裝的詳解

    mysql中rpm方式安裝的詳解

    在本文中小編給大家整理了關(guān)于mysql安裝之rpm方式安裝的詳細(xì)步驟以及注意點(diǎn),需要的朋友們學(xué)習(xí)下。
    2019-03-03
  • 使MySQL能夠存儲(chǔ)emoji表情字符的設(shè)置教程

    使MySQL能夠存儲(chǔ)emoji表情字符的設(shè)置教程

    這篇文章主要介紹了使MySQL能夠存儲(chǔ)emoji表情字符的設(shè)置教程,關(guān)鍵在于utf8mb4字符集的設(shè)置,需要的朋友可以參考下
    2015-12-12
  • 利用MyFlash實(shí)現(xiàn)MySQL數(shù)據(jù)閃回的操作指南

    利用MyFlash實(shí)現(xiàn)MySQL數(shù)據(jù)閃回的操作指南

    MySQL數(shù)據(jù)閃回是一種高級(jí)功能,它允許你在數(shù)據(jù)庫(kù)中恢復(fù)到某個(gè)特定的時(shí)間點(diǎn),通常是事務(wù)開(kāi)始或保存點(diǎn)的狀態(tài),以便處理數(shù)據(jù)錯(cuò)誤或回滾意外更改,本文給大家介紹了如何利用MyFlash實(shí)現(xiàn)MySQL數(shù)據(jù)閃回,需要的朋友可以參考下
    2024-06-06
  • MySQL中TEXT與BLOB字段類型的區(qū)別

    MySQL中TEXT與BLOB字段類型的區(qū)別

    這篇文章主要介紹了MySQL中TEXT與BLOB字段類型的區(qū)別,本文總結(jié)了6大區(qū)別,需要的朋友可以參考下
    2014-08-08
  • MySQL如何添加外鍵

    MySQL如何添加外鍵

    MySQL是一種常用的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),它支持外鍵的添加,本文主要介紹了MySQL如何添加外鍵,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • MySQL外鍵約束的刪除和更新總結(jié)

    MySQL外鍵約束的刪除和更新總結(jié)

    這篇文章主要給大家總結(jié)MySQL外鍵約束的刪除和更新,文中通過(guò)代碼示例和圖文介紹的非常詳細(xì),對(duì)大家了解MySQL外鍵約束有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • 在MySQL中使用GTIDs復(fù)制協(xié)議和中斷協(xié)議的教程

    在MySQL中使用GTIDs復(fù)制協(xié)議和中斷協(xié)議的教程

    這篇文章主要介紹了在MySQL中使用GTIDs復(fù)制協(xié)議和中斷協(xié)議的教程,主要用于多個(gè)服務(wù)器之間的通信,需要的朋友可以參考下
    2015-04-04
  • 刪除MySQL重復(fù)數(shù)據(jù)的方法

    刪除MySQL重復(fù)數(shù)據(jù)的方法

    這篇文章主要介紹了刪除MySQL重復(fù)數(shù)據(jù)的方法,通過(guò)建立中間表實(shí)現(xiàn)針對(duì)冗余數(shù)據(jù)的刪除功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2014-12-12
  • mysql 5.0.45 (修改)拒絕服務(wù)漏洞

    mysql 5.0.45 (修改)拒絕服務(wù)漏洞

    mysql 5.0.45 (修改)拒絕服務(wù)漏洞的方法,追求安全的朋友可以參考下。
    2010-07-07
  • 一文簡(jiǎn)單了解MySQL前綴索引

    一文簡(jiǎn)單了解MySQL前綴索引

    MySQL是支持前綴索引的,也就是說(shuō)你可以定義字符串的一部分作為索引,下面這篇文章主要給大家介紹了關(guān)于MySQL前綴索引的相關(guān)資料,需要的朋友可以參考下
    2022-04-04

最新評(píng)論