欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

什么是索引下推

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

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

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

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

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

我們來具體看一下,在沒有使用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。

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

沒有使用ICP

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

我們看一下示意圖:

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

使用ICP

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

我們看一下示意圖:

可以看到只回表了一次。

除此之外我們還可以看一下執(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訪問方法;
  • 只能用于InnoDB和 MyISAM存儲引擎及其分區(qū)表;
  • InnoDB存儲引擎來說,索引下推只適用于二級索引(也叫輔助索引);

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

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

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

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

查看默認狀態(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é)

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

相關文章

  • mysql中rpm方式安裝的詳解

    mysql中rpm方式安裝的詳解

    在本文中小編給大家整理了關于mysql安裝之rpm方式安裝的詳細步驟以及注意點,需要的朋友們學習下。
    2019-03-03
  • 使MySQL能夠存儲emoji表情字符的設置教程

    使MySQL能夠存儲emoji表情字符的設置教程

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

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

    MySQL數(shù)據(jù)閃回是一種高級功能,它允許你在數(shù)據(jù)庫中恢復到某個特定的時間點,通常是事務開始或保存點的狀態(tài),以便處理數(shù)據(jù)錯誤或回滾意外更改,本文給大家介紹了如何利用MyFlash實現(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是一種常用的關系型數(shù)據(jù)庫管理系統(tǒng),它支持外鍵的添加,本文主要介紹了MySQL如何添加外鍵,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • MySQL外鍵約束的刪除和更新總結(jié)

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

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

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

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

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

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

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

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

    一文簡單了解MySQL前綴索引

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

最新評論