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

一文秒懂MySQL?的索引下推

 更新時(shí)間:2025年12月26日 08:47:23   作者:佛祖讓我來巡山  
索引下推(Index Condition Pushdown)是指讓索引參與更多的篩選工作,減少回表查詢的次數(shù),從而提高查詢效率,本文介紹MySQL的索引下推相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧

秒懂 MySQL 索引下推

?? 一句話概括

索引下推就是讓索引多干點(diǎn)活,少打擾數(shù)據(jù)行

?? 通俗版解釋

想象你在一家大公司找員工信息:

沒有索引下推(傳統(tǒng)方式)

你:人事小姐姐,我要找年齡大于25歲的所有員工

人事:好的,這是500個(gè)符合年齡要求的員工名單(只給了工號(hào))

你:我還需要他們是北京分公司的

人事:那你自己去查這500個(gè)人的詳細(xì)檔案吧

你:?? 我要翻500份檔案,一個(gè)個(gè)看是不是北京分公司的

問題:明明可以在人事那里就過濾掉,非要讓你查500次檔案

有了索引下推(優(yōu)化后)

你:人事小姐姐,我要找年齡大于25歲且是北京分公司的員工

人事:好的,我直接幫你篩選,這是80個(gè)符合要求的員工名單

你:太好了!我只需要查80份檔案

效果:人事(索引)幫你完成了額外篩選,你少查了420次檔案

?? 實(shí)際數(shù)據(jù)庫(kù)例子

-- 員工表,索引在 (年齡, 分公司)
CREATE TABLE 員工表 (
    工號(hào) INT PRIMARY KEY,
    姓名 VARCHAR(50),
    年齡 INT,
    分公司 VARCHAR(50),
    工資 DECIMAL(10,2),
    INDEX idx_年齡_分公司 (年齡, 分公司)
);
-- 傳統(tǒng)查詢(沒有索引下推)
SELECT * FROM 員工表 
WHERE 年齡 > 25 
  AND 分公司 LIKE '北京%';
-- 執(zhí)行過程:
-- 1. 索引找到所有年齡>25的記錄(500條)
-- 2. 拿著500個(gè)工號(hào)去查詳細(xì)檔案(500次)
-- 3. 在500條詳細(xì)記錄中篩選"北京分公司"
-- 開啟索引下推后
-- 執(zhí)行過程:
-- 1. 索引找到所有年齡>25的記錄(500條)
-- 2. 索引自己先篩選"分公司 LIKE '北京%'"(剩80條)
-- 3. 只查80個(gè)員工的詳細(xì)檔案

?? 核心好處

1. 減少跑腿次數(shù)

  • 原來:跑500次檔案室
  • 現(xiàn)在:跑80次檔案室
  • 節(jié)省84%的跑腿時(shí)間

2. 人事小姐姐更聰明了

以前人事只做最簡(jiǎn)單的篩選,現(xiàn)在她能做更多:

  • ? 可以判斷:分公司 = '北京'
  • ? 可以判斷:分公司 LIKE '北京%'
  • ? 可以判斷:年齡 BETWEEN 20 AND 30
  • ? 不能判斷:工資 > 10000(因?yàn)楣べY信息在檔案里)

??? 什么情況下能用?

能用的情況

-- 情況1:索引里有的信息,人事自己就能判斷
-- 索引:(年齡, 城市)
SELECT * FROM 用戶 
WHERE 年齡 > 20 
  AND 城市 LIKE '上海%';  -- ? 能用!城市在索引里
-- 情況2:部分條件在索引里
SELECT * FROM 訂單 
WHERE 用戶ID = 1001 
  AND 狀態(tài) = '已支付';  -- ? 能用!兩個(gè)都在索引里

不能用的情況

-- 情況1:要的信息索引里全有,不需要查檔案
-- 索引:(姓名, 年齡)
SELECT 姓名, 年齡 FROM 員工;  -- ? 不需要!直接看名單就行
-- 情況2:條件不在索引里
-- 索引:(年齡, 城市)
SELECT * FROM 用戶 
WHERE 年齡 > 20 
  AND 工資 > 10000;  -- ? 不能用!工資不在索引里

?? 實(shí)際效果對(duì)比

測(cè)試數(shù)據(jù)

  • 員工表:100萬條記錄
  • 年齡>25:50萬人
  • 北京分公司:5萬人

查詢速度對(duì)比

傳統(tǒng)方式:
? 索引掃描:找到50萬條記錄(很快)
? 回表查詢:查50萬次詳細(xì)數(shù)據(jù)(很慢?。?
? 內(nèi)存篩選:在50萬條里找北京的(一般慢)
?? 總耗時(shí):3.2秒
索引下推:
? 索引掃描+篩選:直接找到5萬條記錄(稍慢一點(diǎn))
? 回表查詢:只查5萬次詳細(xì)數(shù)據(jù)(快很多!)
?? 總耗時(shí):0.8秒

提速4倍!

?? 生活化類比

類比1:圖書館找書

傳統(tǒng):圖書管理員只按"作者=魯迅"找書,找到100本
      你一本本翻看是不是"小說類"
下推:告訴管理員"作者=魯迅 AND 類別=小說"
      直接給你30本小說

類比2:外賣篩選

傳統(tǒng):美團(tuán)先按"距離<3km"篩選出50家店
      你再一家家看有沒有"評(píng)分>4.5"
下推:直接搜索"距離<3km AND 評(píng)分>4.5"
      直接顯示15家符合的店

?? 簡(jiǎn)單總結(jié)

三句話記住索引下推

  • 讓索引多干活:索引不只是找位置,還能做篩選
  • 減少回表次數(shù):篩選好了再查詳細(xì)數(shù)據(jù),少查很多次
  • 條件要在索引里:只能篩選索引中包含的條件

開啟和查看

-- 默認(rèn)就是開啟的(MySQL 5.6+)
-- 查看有沒有用上
EXPLAIN SELECT ...;
-- 看到"Using index condition"就是用了索引下推

?? 什么時(shí)候最有效?

場(chǎng)景效果原因
大表篩選?????減少大量回表
索引選擇性高????過濾掉大部分?jǐn)?shù)據(jù)
查詢條件多???提前過濾更有效
小表查詢?本來就沒多少數(shù)據(jù)

一句話:數(shù)據(jù)量越大,篩選條件越多,索引下推效果越明顯!

?? 思考題

如果你要查:

"年齡&gt;30歲的北京分公司程序員"

但索引只有 (年齡, 分公司),沒有職位字段。

問:索引下推能幫你過濾掉什么?什么過濾不了?

答案

  • ? 能過濾:年齡>30 且 分公司=北京
  • ? 不能過濾:職位=程序員(需要查了檔案才知道)

所以還是會(huì)先過濾掉非北京分公司的,再查檔案看是不是程序員。

這就是索引下推的核心思想:能提前過濾的絕不留到后面!

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

相關(guān)文章

  • mysql主鍵的缺少導(dǎo)致備庫(kù)hang住

    mysql主鍵的缺少導(dǎo)致備庫(kù)hang住

    最近線上頻繁的出現(xiàn)slave延時(shí)的情況,經(jīng)排查發(fā)現(xiàn)為用戶在刪除數(shù)據(jù)的時(shí)候,由于表主鍵的主鍵的缺少,同時(shí)刪除條件沒有索引,或或者刪除的條件過濾性極差,導(dǎo)致slave出現(xiàn)hang住
    2016-05-05
  • 數(shù)據(jù)庫(kù)Mysql性能優(yōu)化詳解

    數(shù)據(jù)庫(kù)Mysql性能優(yōu)化詳解

    這篇文章主要介紹了數(shù)據(jù)庫(kù)Mysql性能優(yōu)化的相關(guān)資料,需要的朋友可以參考下
    2016-05-05
  • MySQL安裝后沒有my.ini配置文件的解決

    MySQL安裝后沒有my.ini配置文件的解決

    這篇文章主要介紹了MySQL安裝后沒有my.ini配置文件的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • MySQL索引的各種類型

    MySQL索引的各種類型

    這篇文章主要介紹了MySQL索引的各種類型,幫助大家更好的理解和學(xué)習(xí)MySQL索引,感興趣的朋友可以了解下
    2020-09-09
  • SQL中EXPLAIN命令的使用方法

    SQL中EXPLAIN命令的使用方法

    這篇文章主要給大家介紹了關(guān)于SQL中EXPLAIN命令的使用方法,文中介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Mysql中JDBC的三種查詢(普通、流式、游標(biāo))詳解

    Mysql中JDBC的三種查詢(普通、流式、游標(biāo))詳解

    這篇文章主要介紹了Mysql中JDBC的三種查詢(普通、流式、游標(biāo))詳解,JDBC(Java DataBase Connectivity:java數(shù)據(jù)庫(kù)連接)是一種用于執(zhí)行SQL語句的Java API,可以為多種關(guān)系型數(shù)據(jù)庫(kù)提供統(tǒng)一訪問,它是由一組用Java語言編寫的類和接口組成的,需要的朋友可以參考下
    2023-08-08
  • MySQL的集群配置的基本命令使用及一次操作過程實(shí)錄

    MySQL的集群配置的基本命令使用及一次操作過程實(shí)錄

    這篇文章主要介紹了MySQL的集群配置過程中的基本命令使用,實(shí)錄中給出了兩個(gè)節(jié)點(diǎn)連接的例子,更多的話同理:)需要的朋友可以參考下
    2015-11-11
  • 刪除MySQL中所有表的外鍵的兩種方法

    刪除MySQL中所有表的外鍵的兩種方法

    這篇文章主要介紹了刪除MySQL中所有表的外鍵的兩種方法,文中通過代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-05-05
  • MySQL5.6.22安裝配置方法圖文教程

    MySQL5.6.22安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了MySQL5.6.22安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • MySQL查詢截取的深入分析

    MySQL查詢截取的深入分析

    這篇文章主要給大家介紹了關(guān)于MySQL查詢截取的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01

最新評(píng)論

寻乌县| 葫芦岛市| 余庆县| 蒲江县| 长乐市| 凤冈县| 定安县| 新昌县| 平顶山市| 和静县| 恩施市| 上栗县| 辽宁省| 西城区| 利津县| 威远县| 游戏| 含山县| 仙桃市| 方山县| 沂南县| 临武县| 新乡市| 徐州市| 北票市| 白银市| 宿松县| 尚志市| 牙克石市| 司法| 淮阳县| 高碑店市| 莎车县| 民县| 陵川县| 定陶县| 应用必备| 仁布县| 张家川| 鹿邑县| 富平县|