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

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

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

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

什么是索引下推

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

沒有使用ICP

在MySQL 5.6之前,存儲(chǔ)引擎根據(jù)通過聯(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過濾。按照過濾后的數(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訪問方法;
  • 只能用于InnoDB和 MyISAM存儲(chǔ)引擎及其分區(qū)表;
  • 對(duì)InnoDB存儲(chǔ)引擎來說,索引下推只適用于二級(jí)索引(也叫輔助索引);

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

  • 引用了子查詢的條件不能下推;
  • 引用了存儲(chǔ)函數(shù)的條件不能下推,因?yàn)榇鎯?chǔ)引擎無法調(diào)用存儲(chǔ)函數(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";

總結(jié)

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

相關(guān)文章

  • MSSQL 添加字段說明

    MSSQL 添加字段說明

    MSSQL 字段添加方法。
    2009-05-05
  • mybatis 模糊查詢的實(shí)現(xiàn)方法

    mybatis 模糊查詢的實(shí)現(xiàn)方法

    這篇文章主要介紹了mybatis 模糊查詢的實(shí)現(xiàn)方法的相關(guān)資料,希望通過本文能幫助到大家,讓大家掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • MySQL為何不建議使用默認(rèn)值為null列

    MySQL為何不建議使用默認(rèn)值為null列

    本文主要介紹了MySQL為何不建議使用默認(rèn)值為null列,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • MySQL中對(duì)于not in和minus使用的優(yōu)化

    MySQL中對(duì)于not in和minus使用的優(yōu)化

    這篇文章主要介紹了MySQL中對(duì)于not in和minus使用的優(yōu)化,作者給出了實(shí)例和運(yùn)行時(shí)間對(duì)比,需要的朋友可以參考下
    2015-05-05
  • Linux系統(tǒng)每日定時(shí)備份mysql數(shù)據(jù)的方法步驟

    Linux系統(tǒng)每日定時(shí)備份mysql數(shù)據(jù)的方法步驟

    這篇文章主要介紹了Linux系統(tǒng)每日定時(shí)備份mysql數(shù)據(jù)的方法步驟,包括創(chuàng)建文件夾、編寫腳本、設(shè)置定時(shí)任務(wù)和測(cè)試腳本,詳細(xì)步驟涵蓋從文件夾創(chuàng)建到腳本執(zhí)行的全過程,幫助用戶實(shí)現(xiàn)數(shù)據(jù)庫的自動(dòng)備份,需要的朋友可以參考下
    2024-11-11
  • Mysql MVCC多版本并發(fā)控制詳情

    Mysql MVCC多版本并發(fā)控制詳情

    這篇文章主要介紹了Mysql MVCC多版本并發(fā)控制詳情,MVCC是一種并發(fā)控制的方法,一般在數(shù)據(jù)庫管理系統(tǒng)中,實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的并發(fā)訪問,在編程語言中實(shí)現(xiàn)事務(wù)內(nèi)存,下文更多相關(guān)介紹需要的小伙伴可以參考一下
    2022-04-04
  • MySQL SQL優(yōu)化教程之in和range查詢

    MySQL SQL優(yōu)化教程之in和range查詢

    這篇文章主要給大家介紹了關(guān)于MySQL SQL優(yōu)化教程之in和range查詢的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • mysql中一個(gè)普通ERROR 1135 (HY000)錯(cuò)誤引發(fā)的血案

    mysql中一個(gè)普通ERROR 1135 (HY000)錯(cuò)誤引發(fā)的血案

    ERROR 1135 (HY000): Can’t create a new thread (errno 11);if you are not out of available memory,you can consult the manual for a possible OS-dependent bug
    2015-08-08
  • mysql密碼忘記怎么辦

    mysql密碼忘記怎么辦

    mysql密碼忘記怎么辦?卸載重裝?這篇文章主要為大家詳細(xì)介紹了不卸載也能重新設(shè)置密碼的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • MySQL慢查詢?nèi)罩驹斀馀c性能優(yōu)化指南(總結(jié))

    MySQL慢查詢?nèi)罩驹斀馀c性能優(yōu)化指南(總結(jié))

    慢查詢?nèi)罩臼荕ySQL數(shù)據(jù)庫性能優(yōu)化的重要工具,通過分析慢查詢?nèi)罩?我們可以識(shí)別和解決那些影響數(shù)據(jù)庫性能的瓶頸問題,這篇文章主要介紹了MySQL慢查詢?nèi)罩驹斀馀c性能優(yōu)化指南,需要的朋友可以參考下
    2024-07-07

最新評(píng)論

镇安县| 广汉市| 滦南县| 麟游县| 垣曲县| 临泉县| 朝阳区| 宕昌县| 嘉义县| 南澳县| 孝感市| 大庆市| 舟山市| 东至县| 南城县| 通辽市| 那曲县| 上蔡县| 左权县| 古浪县| 内黄县| 化德县| 万州区| 鄂尔多斯市| 陇川县| 鄢陵县| 台中县| 黄山市| 晋中市| 谷城县| 武山县| 松阳县| 剑川县| 左权县| 宜黄县| 梧州市| 囊谦县| 永和县| 南丰县| 合山市| 大理市|