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

一文秒懂MySQL?的索引下推

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

秒懂 MySQL 索引下推

?? 一句話概括

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

?? 通俗版解釋

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

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

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

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

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

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

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

問(wèn)題:明明可以在人事那里就過(guò)濾掉,非要讓你查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)查詢(xún)(沒(méi)有索引下推)
SELECT * FROM 員工表 
WHERE 年齡 > 25 
  AND 分公司 LIKE '北京%';
-- 執(zhí)行過(guò)程:
-- 1. 索引找到所有年齡>25的記錄(500條)
-- 2. 拿著500個(gè)工號(hào)去查詳細(xì)檔案(500次)
-- 3. 在500條詳細(xì)記錄中篩選"北京分公司"
-- 開(kāi)啟索引下推后
-- 執(zhí)行過(guò)程:
-- 1. 索引找到所有年齡>25的記錄(500條)
-- 2. 索引自己先篩選"分公司 LIKE '北京%'"(剩80條)
-- 3. 只查80個(gè)員工的詳細(xì)檔案

?? 核心好處

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

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

2. 人事小姐姐更聰明了

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

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

??? 什么情況下能用?

能用的情況

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

不能用的情況

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

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

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

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

查詢(xún)速度對(duì)比

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

提速4倍!

?? 生活化類(lèi)比

類(lèi)比1:圖書(shū)館找書(shū)

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

類(lèi)比2:外賣(mài)篩選

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

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

三句話記住索引下推

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

開(kāi)啟和查看

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

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

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

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

?? 思考題

如果你要查:

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

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

問(wèn):索引下推能幫你過(guò)濾掉什么?什么過(guò)濾不了?

答案

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

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

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

到此這篇關(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)為用戶(hù)在刪除數(shù)據(jù)的時(shí)候,由于表主鍵的主鍵的缺少,同時(shí)刪除條件沒(méi)有索引,或或者刪除的條件過(guò)濾性極差,導(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安裝后沒(méi)有my.ini配置文件的解決

    MySQL安裝后沒(méi)有my.ini配置文件的解決

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

    MySQL索引的各種類(lèi)型

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

    SQL中EXPLAIN命令的使用方法

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

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

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

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

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

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

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

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

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

    MySQL查詢(xún)截取的深入分析

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

最新評(píng)論

瑞金市| 中山市| 新巴尔虎右旗| 普安县| 江陵县| 汶上县| 新干县| 彰化县| 湘西| 醴陵市| 东宁县| 潼关县| 公主岭市| 呼玛县| 韶山市| 印江| 大姚县| 济南市| 无为县| 永嘉县| 嘉定区| 宁陵县| 睢宁县| 黄大仙区| 白沙| 汉阴县| 随州市| 霍邱县| 麦盖提县| 虹口区| 达尔| 大荔县| 淅川县| 朔州市| 东兰县| 荆门市| 雷山县| 北海市| 鄂尔多斯市| 克什克腾旗| 安徽省|