MySQL 索引下推

概念

索引下推(Index Condition Pushdown,簡稱 ICP) 是 MySQL 5.6 版本中提供的一項索引優化功能,它允許存儲引擎在索引遍歷過程中,執行部分 WHERE字句的判斷條件,直接過濾掉不滿足條件的記錄,從而減少回表次數,提高查詢效率。

例子

假設我們有一個名為 user 的表,創建了聯合索引(name, age)。

CREATE TABLE `user` (`id` int NOT NULL AUTO_INCREMENT,`name` varchar(20)  NOT NULL,`high` int NOT NULL,`age` int NOT NULL,PRIMARY KEY (`id`),KEY `idx_name_age` (`name`,`age`)
);
SELECT * FROM user WHERE name = '張三' AND age > 3;
  • 沒有索引下推之前,即使 name字段利用索引可以幫助我們快速定位到 name = ‘張三’ 的用戶,但我們仍然需要對每一個找到的用戶進行回表操作,獲取完整的用戶數據,再去判斷 age > 3。
  • 有了索引下推之后,存儲引擎會在使用name字段索引查找name = ‘張三’ 的用戶時,同時判斷 age > 3。這樣,只有同時滿足條件的記錄才會被返回,減少了回表次數。
SET optimizer_switch = 'index_condition_pushdown=off';
explain SELECT * FROM user WHERE name = '張三' AND age > 3;

在這里插入圖片描述

SET optimizer_switch = 'index_condition_pushdown=on';
explain SELECT * FROM user WHERE name = 'k哥' AND age > 3;

在這里插入圖片描述
在這里插入圖片描述

原理

先看下面這張 MySQL 簡要架構圖。
在這里插入圖片描述

  1. MySQL 可以簡單分為 Server 層和存儲引擎層這兩層。Server 層處理查詢解析、分析、優化、緩存以及與客戶端的交互等操作,而存儲引擎層負責數據的存儲和讀取,MySQL 支持 InnoDB、MyISAM、Memory 等多種存儲引擎。
  2. 索引下推的下推其實就是指將部分上層(Server 層)負責的事情,交給了下層(存儲引擎層)去處理。

我們這里結合索引下推原理再對上面提到的例子進行解釋。

沒有索引下推之前:

  • 存儲引擎層先根據 name 索引字段找到所有 name = ‘k哥’ 的用戶的主鍵 ID,然后二次回表查詢,獲取完整的用戶數據;
  • 存儲引擎層把所有 name = ‘k哥’ 的用戶數據全部交給 Server 層,Server 層根據 age > 3 這一條件再進一步做篩選。

有了索引下推之后:

  • 存儲引擎層先根據 name 索引字段找到所有 name = ‘k哥’ 的用戶,然后直接判斷age > 3,篩選出符合條件的主鍵 ID;
  • 二次回表查詢,根據符合條件的主鍵 ID 去獲取完整的用戶數據;
  • 存儲引擎層把符合條件的用戶數據全部交給 Server 層。
    可以看出,除了可以減少回表次數之外,索引下推還可以減少存儲引擎層和 Server 層的數據傳輸量。

總結

索引下推應用范圍

  1. 適用于 InnoDB 引擎和 MyISAM 引擎的查詢。
  2. 適用于執行計劃是 range, ref, eq_ref, ref_or_null 的范圍查詢。
  3. 對于 InnoDB 表,僅用于非聚簇索引。
    • 索引下推的目標是減少全行讀取次數,從而減少 I/O 操作。
    • 對于 InnoDB 聚集索引,完整的記錄已經讀入 InnoDB 緩沖區。
    • 在這種情況下使用索引下推不會減少 I/O。
  4. 子查詢不能使用索引下推,因為子查詢通常會創建臨時表來處理結果,而這些臨時表是沒有索引的。
  5. 存儲過程不能使用索引下推,因為存儲引擎無法調用存儲函數。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/74134.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/74134.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/74134.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

NVIDIA Dynamo源碼編譯

Ref https://github.com/PyO3/maturin Rust 程序設計語言 代碼庫: https://github.com/ai-dynamo/dynamo https://github.com/ai-dynamo/nixl dynamo/container/Dockerfile.vllm 相關whl包 官方提供了4個whl包 ai_dynamo # 這個包ubuntu 22.04也可以用&…

【Android】安卓原生應用播放背景音樂與音效(筆記)

本文提供完整的音頻管理器代碼,涵蓋了背景音樂(BGM)和短音效的播放控制。無論是游戲中的音效,還是應用中的背景音樂,通過 AudioManager,你可以方便地管理和控制音頻資源。 前言 在 Android 開發中&#xf…

Unity | 游戲數據配置

目錄 一、ScriptableObject 1.創建ScriptableObject 2.創建asset資源 3.asset資源的讀取與保存 二、Excel轉JSON 1.Excel格式 2.導表工具 (1)處理A格式Excel (2)處理B格式Excel 三、解析Json文件 1.讀取test.json文件 四、相關插件 在游戲開發中,策劃…

2025信創即時通訊排行:安全合規與生態適配雙輪驅動

隨著信息技術應用創新(信創)戰略的深化,國產即時通訊工具在政企市場的滲透率顯著提升。2025年作為“十四五”規劃收官之年,信創產業迎來規模化應用關鍵節點。本文將從認證標準、市場表現、技術架構、行業適配四大維度,…

關于TVS管漏電流的問題?

問題描述: 在量產的帶電池故事機生產中,工廠產線測試電流時,有1臺機器電流比正常機器大10mA左右。 原因分析: 1、分析電路原理圖,去除可能出現問題的電壓或器件(不影響系統),發現…

RAG 架構地基工程-Retrieval 模塊的系統設計分享

目錄 一、知識注入的關鍵前奏——RAG 系統中的檢索綜述 (一)模塊定位:連接語言模型與知識世界的橋梁 (二)核心任務:四大關鍵問題的協調解法 (三)系統特征:性能、精度…

Java-servlet(七)詳細講解Servlet注解

Java-servlet(七)詳細講解Servlet注解 前言一、注解的基本概念二、Override 注解2.1 作用與優勢2.2 示例代碼 三、Target 注解3.1 定義與用途3.2 示例代碼 四、WebServlet 注解4.1 作用4.2 示例代碼 五、反射與注解5.1 反射的概念5.2 注解與反射的結合使…

機器學習——分類、回歸、聚類、LASSO回歸、Ridge回歸(自用)

糾正自己的誤區:機器學習是一個大范圍,并不是一個小的方向,比如:線性回歸預測、卷積神經網絡和強化學都是機器學習算法在不同場景的應用。 機器學習最為關鍵的是要有數據,也就是數據集 名詞解釋:數據集中的…

本地AI大模型工具箱 Your local AI toolkit:LMStudio

LMStudio介紹 官網:LM Studio - Discover, download, and run local LLMs LMStudio 是一個面向機器學習和自然語言處理的,旨在使開發者更容易構建和部署AI語言模型的應用軟件。 LMStudio的特點是: 完全本地離線運行AI大模型 可以從Huggi…

[OpenCV】相機標定之棋盤格角點檢測與繪制

在OpenCV中,棋盤格角點檢測與繪制是一個常見的任務,通常用于相機標定。 棋盤格自定義可參考: OpenCV: Create calibration pattern 目錄 1. 棋盤格角點檢測 findChessboardCorners()2. 棋盤格角點繪制 drawChessboardCorners()3. 代碼示例C版本python版本…

redis的典型應用 --緩存

Redis最主要的用途,分為三個方面: 1.存儲數據(內存數據庫) 2.緩存(最常用) 3.消息隊列 緩存 (cache) 是計算機中的?個經典的概念。核?思路就是把?些常?的數據放到觸?可及(訪問速度更快)的地?&…

本地基于Ollama部署的DeepSeek詳細接口文檔說明

前文,我們已經在本地基于Ollama部署好了DeepSeek大模型,并且已經告知過如何查看本地的API。為了避免網絡安全問題,我們希望已經在本地調優的模型,能夠嵌入到在本地的其他應用程序中,發揮本地DeepSeek的作用。因此需要知…

基于ArcGIS和ETOPO-2022 DEM數據分層繪制全球海陸分布

第〇部分 前言 一幅帶有地理空間參考、且包含海陸分布的DEM圖像在研究區的繪制中非常常見,本文將實現以下圖像的繪制 關鍵步驟: (1)NOAA-NCEI官方下載最新的ETOPO-2022 DEM數據 (2)在ArcGIS(…

自動化測試框架pytest+requests+allure

Pytest requests Allure 這個框架基于python的的 Pytest 進行測試執行,并結合 Allure插件 生成測試報告的測試框架。采用 關鍵字驅動 方式,使測試用例更加清晰、模塊化,同時支持 YAML 文件來管理測試用例,方便維護和擴展。 測試…

Retrofit中scalars轉換html為字符串

簡介 在Retrofit中,如果你想直接獲取HTML或其他文本格式的響應內容而不是將其映射到一個模型類,ScalarsConverterFactory 就派上用場了。ScalarsConverterFactory 是一個轉換器工廠,它能夠將響應體轉換為Java基本類型如String、Integer或Byte…

Powershell WSL Windows系統復制數據到ubuntu子系統系統

從本地D盤下拷貝數據到ubuntu子系統下 Powershell 管理員打開執行 /mnt/d 此處是本地Windows系統的路徑表示/opt ubutu 子系統目錄 wsl -d Ubuntu-22.04 -u root -- bash -c cp -rf /mnt/d/nginx.conf /opt/從ubuntu子系統中拷貝數據到本地D盤下 Powershell 管理員打開執行…

【多線程】線程安全集合類,ConcurrentHashMap實現原理

文章目錄 線程安全集合類解決方案多線程環境使用順序表多線程環境使用隊列多線程環境使用哈希表ConcurrentHashMap1. 縮小鎖的粒度2. 充分使用 CAS3. 針對擴容操作 線程安全集合類 ArrayList、Queue、HsahMap… 都是線程不安全的 Vector、Stack、Hashtable 都是線程安全的&am…

spring-tx筆記

編程式事務與聲明式事務的理解 補充:什么是事務? 事務是一個重要概念,尤其在數據庫管理系統中。事務是指一組操作。,這些操作要么全部成功執行,要么全部不執行,確保數據的一致性和完整性 編程式事務 編…

Android第四次面試(Java基礎篇)

一、Java 中的 DCL 單例模式 單例模式是設計模式中最常用的模式之一,其核心目標是確保一個類在程序中僅有一個實例,并提供全局訪問點。在 Java 中,實現單例模式需要兼顧線程安全和性能優化。DCL(Double-Checked Locking&#xff0…

Java-SpringBootWeb入門、Spring官方腳手架連接不上解決方法

一. Spring 官網:Spring | Home Spring發展到今天已經形成了一種開發生態圈,Spring提供了若干個子項目,每個項目用于完成特定的功能(Spring全家桶) Spring Boot可以幫助我們非常快速的構建應用程序、簡化開發、提高效率 。 二. Spring Boot入…