mysql5.7系列-索引下推(cover_index)

什么是索引下推

ICP(Index Condition Pushdown)是在MySQL 5.6版本上推出的查詢優化策略,把本來由Server層做的索引條件檢查下推給存儲引擎層來做,以降低回表和訪問存儲引擎的次數,提高查詢效率。

回顧下mysql的架構分層,連接層、server層、引擎層:

分析索引下推

索引下推是 MySQL 5.6引入了一種優化技術,默認開啟,查看開啟情況

select @@optimizer_switch

使用SET optimizer_switch = ‘index_condition_pushdown=off’;可以將其關閉。

SET optimizer_switch = 'index_condition_pushdown=off';
SET optimizer_switch = 'index_condition_pushdown=on';

官方文檔中給的例子和解釋如下: people表中(zipcode,lastname,firstname)構成一個索引SELECT * FROM people WHERE zipcode=’200030′ AND lastname LIKE ‘%etrunia%’ AND address LIKE ‘%Main Street%’;

我們先來創建這個表


CREATE TABLE people (`id` int NOT NULL AUTO_INCREMENT COMMENT 'id',zipcode VARCHAR(10),lastname VARCHAR(50),firstname VARCHAR(50),address VARCHAR(200),PRIMARY KEY (`id`)
);
CREATE INDEX idx_zc_people_names ON people(zipcode,lastname, firstname);

再初始化一些數據

-- 常見姓名 + 地址 + 郵編
INSERT INTO people (zipcode, lastname, firstname, address) VALUES ('100000', '王', '偉', '北京市海淀區中關村大街1號');
INSERT INTO people (zipcode, lastname, firstname, address) VALUES ('200030', '李', '娜', '上海市徐匯區淮海中路1234弄56號');
INSERT INTO people (zipcode, lastname, firstname, address) VALUES ('510000', '張', '強', '廣州市天河區體育西路789號');
INSERT INTO people (zipcode, lastname, firstname, address) VALUES ('310012', '劉', '洋', '杭州市西湖區文三路456號');
INSERT INTO people (zipcode, lastname, firstname, address) VALUES ('518000', '陳', '靜', '深圳市福田區深南大道101號');-- 復姓 + 詳細地址
INSERT INTO people (zipcode, lastname, firstname, address) VALUES ('266071', '歐陽', '晨曦', '青島市市南區香港中路10號');
INSERT INTO people (zipcode, lastname, firstname, address) VALUES ('215006', '司馬', '浩然', '蘇州市姑蘇區干將東路288號');-- 少數民族姓名 + 地區特色地址
INSERT INTO people (zipcode, lastname, firstname, address) VALUES ('830000', '阿依', '古麗', '烏魯木齊市天山區解放南路22號');
INSERT INTO people (zipcode, lastname, firstname, address) VALUES ('550001', '扎西', '多吉', '拉薩市城關區北京中路12號');

我們執行下這個語句,分析下開啟索引下推和不開啟的區別

EXPLAIN select zipcode from people where zipcode='100000' and lastname like '%劉%' and address like '%海淀區%';

不開啟索引下推

如果沒有使用索引下推技術,則MySQL會通過zipcode=’200030’從存儲引擎中查詢對應的數據,返回到MySQL服務層,然后MySQL服務層基于lastname LIKE ‘%etrunia%’和address LIKE ‘%Main Street%’來判斷數據是否符合條件。

關閉索引下推:SET optimizer_switch = 'index_condition_pushdown=off';

Extra的內容為:Using where ,代表著服務層的條件過濾 。

開啟索引下推

如果使用了索引下推技術,則MYSQL首先會返回符合zipcode=’95054’的索引,然后根據lastname LIKE ‘%etrunia%’來判斷索引是否符合條件。

如果符合條件,則根據該索引來定位對應的數據,如果不符合,則直接reject掉。有了索引下推優化,可以在有like條件查詢的情況下,減少回表次數。

開啟索引下推:SET optimizer_switch = 'index_condition_pushdown=on';

Extra的內容為:

Using index condition ,使用了索引下推 。

Using where ,代表著服務層的條件過濾(address字段沒有在組合索引里面,所以需要在進行一次條件過濾) 。

當一條SQL使用到索引下推時,explain的執行計劃中的extra字段中內容為:Using index condition

索引下推的作用

有了索引下推的優化,在滿足一定條件下,存儲 引擎層會在回表查詢之前對數據進行過濾,可以減少存儲引擎回表查詢的次數。對于InnoDB聚簇索引來說,完整的行記錄已經加載到緩存區了,索引下推也就沒什么意義了。

附錄

mysql的架構圖

找了一圈都沒找到5.7的架構圖,只在官網找到了8.0的https://dev.mysql.com/doc/refman/8.0/en/pluggable-storage-overview.html

mysql5.7的innodb的架構圖

https://dev.mysql.com/doc/refman/5.7/en/innodb-architecture.html

1. 內存中結構

? 緩沖池(Buffer Pool):緩存頻繁訪問的數據,減少磁盤I/O操作,提高查詢性能。

? 變更緩沖區(Change Buffer):緩存對二級索引頁的更改,當這些頁不在緩沖池中時,以避免耗時的I/O操作。

? 自適應哈希索引(Adaptive Hash Index):為某些讀操作提供快速的內存中查找機制,加速對頻繁查詢索引頁的訪問。

? 日志緩沖區(Log Buffer):保存要寫入事務日志的更改,通過先寫入內存再定期刷新到磁盤上的重做日志,來提高性能。

2. 磁盤上結構

?系統表空間(System Tablespace):存儲變更緩沖區,InnoDB使用一個或多個數據文件來存儲系統表空間。

? 各個表的獨立表空間(File-per-table Tablespaces):每個InnoDB表都可以有自己的表空間。

? 通用表空間(General Tablespaces):可以容納多個表的表空間。

? 撤銷表空間(Undo Tablespaces):存儲撤銷日志,這些日志記錄了事務進行中必須保留的舊數據版本。

? 臨時表空間(Temporary Tablespaces):存儲臨時數據,如排序操作或哈希索引創建過程中的數據。

? 雙寫緩沖區(Doublewrite Buffer):保護數據不因崩潰而損壞,通過先寫入雙寫緩沖區再寫入表空間文件。

? 重做日志(Redo Log):記錄數據變更,以便在系統崩潰后恢復數據。

? 撤銷日志(Undo Logs):記錄了事務進行中必須保留的舊數據版本,以支持事務回滾和MVCC。

資料參考:

1.https://dev.mysql.com/doc/refman/5.7/en/index-condition-pushdown-optimization.html

2.MySQL 架構_mysql架構圖-CSDN博客

原創不易,若有問題,還請批評指正,感謝!

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

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

相關文章

計算機網絡(基礎概念)

計算機網絡(基礎概念)1 初識協議1.1 協議分層2 OSI七層模型2.1 物理層2.2 數據鏈路層2.3 網絡層2.4 傳輸層2.5 應用層3 TCP/IP協議族3.1 什么是TCP/IP協議?3.1.1 OS與網絡關系4 網絡傳輸的基本流程4.1 局域網4.2 MAC地址5 跨網絡傳輸5.1 IP地址6 Socket…

專題 JavaScript 函數基礎

你將知道:函數聲明和表達式函數聲明和表達式之間的區別什么是匿名函數什么是 IIFE命名函數表達式this 關鍵字函數是調用該函數時執行的代碼塊 。函數聲明和表達式讓我們回顧一下它的語法:functionfunctionName(param1, param2, ..., paramN) {// Functio…

數據結構——優先隊列(priority_queue)的巧妙運用

優先隊列是一種相對高級的數據結構,它的底層原理是二叉堆。然而本篇不會執著于深挖其背后的原理,更主要的是理一下它在題目中的一些實用方法,幫助你更快的上手使用。 優先隊列(priority_queue) 優先隊列的特別之處就在于它可以自動進行排序&…

Java:繼承和多態(必會知識點整理)

主要內容繼承多態向上轉型向下轉型方法重寫方法重載super關鍵字動態綁定封裝訪問控制構造方法規則一、繼承 1. 概念: 一句話說就是:“共性抽取,代碼復用”子類會將父類中的成員變量或者成員方法繼承到子類中子類繼承父類之后,必須…

基于esp32系列的開源無線dap-link項目使用介紹

基于esp32系列的開源無線dap-link項目使用介紹🔖有關esp32/8266相關項目:需要自己搭建編譯環境: https://github.com/windowsair/wireless-esp8266-dap/tree/master🌿支持esp32/c3/s3,支持在線固件燒錄,支持AP配網&…

深入了解linux系統—— 進程信號的產生

前言 進程在收到信號之后,可以立即處理,也可以在合適的時間再處理(1-31號普通信號可以不被立即處理) 信號不是被立即處理,信號就要被保存下來,讓進程在合適的時間再去處理。 相關概念 在了解進程是如何保存…

【Bluedroid】藍牙協議棧enable流程深度解析

本文詳細剖析 Bluedroid 藍牙功能啟用的核心流程,從enable()函數觸發開始,深入解析藍牙協議棧的異步啟動機制、核心協議模塊初始化、硬件控制器綁定及狀態同步全流程。重點闡述接口就緒性檢查、異步線程管理、配置文件回調機制等關鍵環節,揭示…

各種開發語言主要語法對比

各類主流編程語言的語法有著顯著差異,這些差異源于語言設計哲學(簡潔性 vs 顯式性)、應用領域(系統級、Web、數據科學)、運行方式(編譯 vs 解釋)以及支持的范式(面向對象、函數式、過…

小鵬汽車6月交付車輛34,611輛,同比增長224%

小鵬汽車-W(09868)發布公告,2025年6月,小鵬汽車共交付智能電動汽車34,611輛,同比增長224%,這標志著小鵬汽車已連續第八個月交付量超過了30,000輛。2025年第二季度,小鵬汽車共交付103,181 輛智能電動車,創下…

深入理解觀察者模式:構建松耦合的交互系統

在軟件開發中,我們經常遇到這樣的場景:一個對象的狀態變化需要通知其他多個對象,并且這些對象需要根據變化做出相應的反應。比如,用戶界面中的數據變化需要實時反映到多個圖表上,或者電商系統中的庫存變化需要通知訂單…

React強大且靈活hooks庫——ahooks入門實踐之常用場景hook

什么是 ahooks? ahooks 是一個 React Hooks 庫,提供了大量實用的自定義 hooks,幫助開發者更高效地構建 React 應用。其中場景類 hooks 是 ahooks 的一個重要分類,專門針對特定業務場景提供解決方案。 安裝 ahooks npm install …

Qt常用控件之QWidget(一)

Qt常用控件之QWidget(一)1.QWidget2.enabled屬性2.geometry🌟🌟hello,各位讀者大大們你們好呀🌟🌟 🚀🚀系列專欄:【Qt的學習】 📝📝本…

AIOT開發選型:行空板 K10 與 M10 適用場景與選型深度解析

前言 隨著人工智能和物聯網技術的飛速發展,越來越多的開發者、學生和愛好者投身于創意項目的構建。 在眾多的開發板中,行空板 K10 和 M10 以其獨特的優勢脫穎而出。 本文旨在為讀者提供一份詳盡的行空板 K10 和 M10 對比分析,從適用場景、…

redis匯總筆記

語雀完整版: https://www.yuque.com/g/mingrun/embiys/calwqx/collaborator/join?tokensLcLnqz5Rv8hOKEB&sourcedoc_collaborator# 《Redis筆記》 Redis 一般問題 Redis內存模型(I/O多路模型)多路復用IO如何解釋 為什么Redis要使用單線…

STM32用PWM驅動步進電機

硬件介紹:連線:注意這里stp連的是pwm脈沖,dir連的是方向到時候代碼pwm波形就是從這里來的,具體接線根據你的代碼來注意要點:步進電機和舵機驅動是不一樣的,它是根據步長來移動的,所以要開一個中…

力扣25.7.10每日一題——重新安排會議得到最多空余時間 II

Description 今天這道題和昨天類似,只是允許順序變化。 Solution 把會議區間視作桌子,空余時間視作空位,我們要把一個桌子移到別的空位中。 初步想法是枚舉桌子,找一個長度大于等于桌子長度的空位移過去。看上去,找…

IP報文分片與重組原理及實現分析

IP報文分片與重組原理及實現分析 引用: ppp/net/packet/IPFragment.hppp/net/packet/IPFragment.cpp 1. IP分片原理 當IP數據包大小超過MTU(最大傳輸單元)時,路由器/主機將其分割為多個片段傳輸,每個片段包含&…

[python]在drf中使用drf_spectacular

安裝drf_spectacular 文檔 pypi鏈接:https://pypi.org/project/drf-spectacular/ 文檔鏈接:https://drf-spectacular.readthedocs.io/en/latest/readme.html 安裝步驟 在環境中添加 pip install drf-spectacular在setting的INSTALLED_APPS中添加 INSTALLED_APPS [# ALL…

【Datawhale AI 夏令營】 用AI做帶貨視頻評論分析(二)

5.預訓練模型跑分 回顧賽題 回顧賽題任務 挑戰與難點: 標注數據少 ——> 半監督學習 or 數據增強 聚類分析噪點影響嚴重 回顧Baseline 問題: TF-IDF無法捕捉以下語義。聚類分析粗糙,未評估聚類質量。 提升方案: 分類任務…

SPSSPRO:數據分析市場SaaS挑戰者的戰略分析

目錄 第一部分:執行摘要 第二部分:平臺解構:產品、架構與用戶體驗 2.1 SaaS范式轉移:架構與起源 2.2 功能能力:分析師的工具箱 2.3 “智能分析”的價值主張 第三部分:市場滲透與受眾細分 3.1 目標用戶…