什么是索引下推

索引下推介紹

索引下推(INDEX CONDITION PUSHDOWN,簡稱 ICP)是在 MySQL 5.6 針對掃描二級索引的一項優化改進。總的來說是通過把索引過濾條件下推到存儲引擎,來減少 MySQL 存儲引擎訪問基表的次數以及 MySQL 服務層訪問存儲引擎的次數。ICP 適用于 MYISAM 和 INNODB,本篇的內容只基于 INNODB。
在講這個技術之前你得對mysql架構有一個簡單的認識,見下圖:
在這里插入圖片描述
● MySQL 服務層:也就是 SERVER 層,用來解析 SQL 的語法、語義、生成查詢計劃、接管從 MySQL 存儲引擎層上推的數據進行二次過濾等等。
● MySQL 存儲引擎層:按照 MySQL 服務層下發的請求,通過索引或者全表掃描等方式把數據上傳到 MySQL 服務層。
● MySQL 索引掃描:根據指定索引過濾條件,遍歷索引找到索引鍵對應的主鍵值后回表過濾剩余過濾條件。
● MySQL 索引過濾:通過索引掃描并且基于索引進行二次條件過濾后再回表。

實戰數據準備

delete from user1;
drop table user1;CREATE TABLE `user1` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(50) NOT NULL,`age` tinyint(4) NOT NULL,`address` varchar(50) NOT NULL,PRIMARY KEY (`id`),KEY `idx_name_age` (`name`,`age`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;INSERT INTO `user1` (`name`, `age`, `address`) VALUES
('Alice', 40, 'address1'),
('Amy', 23, 'address2'),
('Tom', 18, 'address3'),
('Mike', 22, 'address4');explain SELECT * FROM user1 WHERE name LIKE 'A%' and age = 23;# 查看索引下推是否開啟
select @@optimizer_switch
# 開啟索引下推
set optimizer_switch="index_condition_pushdown=on";
# 關閉索引下推
set optimizer_switch="index_condition_pushdown=off";

索引下推實戰

  1. 不使用索引下推實現
    在這里插入圖片描述
Explain SELECT * FROM user1 WHERE name LIKE 'A%' and age = 40;

在這里插入圖片描述

  1. 使用索引下推實現
    在這里插入圖片描述
Explain SELECT * FROM user1 WHERE name LIKE 'A%' and age = 40;

在這里插入圖片描述

索引下推的使用條件

● ICP目標是減少全行記錄讀取,從而減少IO 操作,只能用于非聚簇索引。聚簇索引本身包含的表數據,也就不存在下推一說。
● 只能用于range、 ref、 eq_ref、ref_or_null訪問方法;
● where 條件中是用 and 而非 or 的時候。
● ICP適用于分區表。
● ICP不支持基于虛擬列上建立的索引,比如說函數索引
● ICP不支持引用子查詢作為條件。
● ICP不支持存儲函數作為條件,因為存儲引擎無法調用存儲函數。

參考《圖解|索引覆蓋、索引下推以及如何避免索引失效》

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

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

相關文章

持續格式刷

雙擊格式刷即可

專訪|OpenTiny 開源社區 常浩:完成比完美更重要

前言 2023年已過大半,備受關注的 OpenTiny*開源之夏活動也順利結項。開源之夏由中國科學院軟件研究所發起的計劃,目的在于鼓勵在校學生積極參與開源軟件的開發維護,推動優秀開源軟件社區的繁榮發展。該活動聯合各大開源社區,聚焦…

令人贊嘆的花里胡哨的代碼雨動畫效果

【點我-這里送書】 本人詳解 作者:王文峰,參加過 CSDN 2020年度博客之星,《Java王大師王天師》 公眾號:JAVA開發王大師,專注于天道酬勤的 Java 開發問題中國國學、傳統文化和代碼愛好者的程序人生,期待你的關注和支持!本人外號:神秘小峯 山峯 轉載說明:務必注明來源(…

element emitter broadcast向下廣播 dispatch向上分派

emitter 項目使用element的emitter.js,做個使用記錄 function broadcast(componentName, eventName, params) {this.$children.forEach(child > {const name child.$options.name;if (name componentName) {child.$emit.apply(child, [eventName].concat(para…

pytorch訓練出現的bug

訓練過后發現.csv文件左側出現了幾列unname和一列0,1,2。這個時候在訓練就會從unname那一列開始訓練。我們需要把這幾列刪除,之后再重新訓練

華清遠見嵌入式學習——網絡編程——作業3

目錄 作業要求&#xff1a;基于UDP的TFTP文件傳輸 代碼 下載功能效果圖?編輯 上傳功能效果圖 思維導圖 模擬面試題和答案&#xff08;定期更新&#xff09; 作業要求&#xff1a;基于UDP的TFTP文件傳輸 完成文件的上傳和下載功能 代碼 #include<myhead.h>//實現…

前端Math屬性方法匯總集錦

Description of Math Math 是一個內置對象&#xff0c;它擁有一些數學常數屬性和數學函數方法。Math 不是一個函數對象。 Math 用于 Number 類型。它不支持 BigInt。 與其他全局對象不同的是&#xff0c;Math 不是一個構造器。Math 的所有屬性與方法都是靜態的。引用圓周率的寫…

『heqingchun-Ubuntu系統+x86架構+編譯安裝ffmpeg+帶有nvidia硬件加速』

Ubuntu系統x86架構編譯安裝ffmpeg帶有nvidia硬件加速 一、準備文件 注&#xff1a;可直接下載我上傳的CSDN資源&#xff0c;然后直接跳到"一"中的第"3"項"將文件按以下順序存放"。 ffmpeg源碼&#xff1a;音視頻開發ffmpeg編譯所需資源文件 其…

Pgsql常用命令

Postgresql數據庫常用命令 1、連接數據庫, 默認的用戶和數據庫是postgres psql -h host -p port -U user -d dbname 2、執行sql文件 psql -h ${PGHOST} -p ${PGPORT} -U ${PGUSER} -d safe_browser -f xxxx.sql \i /xxxxx/xxx/xxxxxx.sql 3、切換數據庫,相當于mysql的use d…

Ajax技

Ajax的特點 異步提交&#xff1a;Ajax采用異步通信方式&#xff0c;能夠在頁面無需重新加載的情況下向服務器發送請求并接收響應數據&#xff0c;提升了用戶體驗。無需插件&#xff1a;Ajax是基于標準瀏覽器的Javascript和XMLHttpRequest對象實現的&#xff0c;無需安裝插件或…

打開和關閉conda,激活和關閉conda,詳解退出conda環境

Python編程技巧&#xff1a;詳解退出conda環境 https://www.python100.com/html/110499.html # 創建虛擬環境~/anaconda3/bin/conda create -n name python3.6 # 激活虛擬環境 source ~/anaconda3/bin/activate name # 查看所有環境 conda env list # 激活虛擬環境 conda activ…

使用JVS低代碼表單引擎高效管理文件,實現個性化需求

在數字化、信息化的時代&#xff0c;文件上傳與管理功能已經成為了各類應用系統的標配。無論是在辦公自動化、項目管理還是內容管理系統中&#xff0c;我們都希望能輕松、高效地完成文件的上傳、查看和管理。JVS低代碼表單引擎提供了文件類組件。無論是文件類型、大小的限制&am…

ubuntu Setforeground 前臺應用切換

場景分析 有這樣一個系統&#xff0c;一個服務主進程用于接收指令&#xff0c;其它服務是獨立的gui 程序&#xff0c;服務進程根據命令將對應的gui 程序切換到前臺。 windows 平臺有Setforeground 這個api&#xff0c;可以根據進程ID&#xff0c;將某個應用的窗口切換到前臺。…

SpringBoot整合Redis,redis連接池和RedisTemplate序列化

SpringBoot整合Redis 1、SpringBoot整合redis1.1 pom.xml1.2 application.yml1.3 配置類RedisConfig&#xff0c;實現RedisTemplate序列化1.4 代碼測試 2、SpringBoot整合redis幾個疑問&#xff1f;2.1、Redis 連接池講解2.2、RedisTemplate和StringRedisTemplate 3、RedisTemp…

UniApp打包教程:使用HBuilder X和AppUploader完成原生App云打包和上架指南“

? 目錄 uniapp進行打包 使用上架工具appuplode進行發包 1.登錄appuploder軟件 2.登陸開發者App Store后臺 uniapp進行打包 在HBuilder X編輯器中打開需要打包的項目&#xff0c;然后點擊上面菜單欄中 發行 > 原生App-云打包&#xff0c;對以下彈出的彈窗進行內容填寫 ?…

競賽python區塊鏈實現 - proof of work工作量證明共識算法

文章目錄 0 前言1 區塊鏈基礎1.1 比特幣內部結構1.2 實現的區塊鏈數據結構1.3 注意點1.4 區塊鏈的核心-工作量證明算法1.4.1 拜占庭將軍問題1.4.2 解決辦法1.4.3 代碼實現 2 快速實現一個區塊鏈2.1 什么是區塊鏈2.2 一個完整的快包含什么2.3 什么是挖礦2.4 工作量證明算法&…

Java計算時間差,距結束還有幾天幾小時幾分鐘

文章目錄 1、寫法2、備份3、LocalDate、LocalDateTime、Date、String互轉 1、寫法 //靜態方法&#xff0c;傳入年月日時分秒 LocalDateTime startTime LocalDateTime.of(2023, 11, 22, 15, 09, 59); LocalDateTime endTime LocalDateTime.of(2023, 11, 30, 0, 0, 0); //計算…

Java基層衛生健康云綜合管理(云his)系統源碼

云HIS&#xff08;Cloud-Based Healthcare Information System&#xff09;是基于云計算的醫院健康衛生信息系統。它運用云計算、大數據、物聯網等新興信息技術&#xff0c;按照現代醫療衛生管理要求&#xff0c;在一定區域范圍內以數字化形式提供醫療衛生行業數據收集、存儲、…

indexedDB存儲

使用 setDBData({ id: name, value: 張三, expire: new Date().getTime() 10000 }, info, infoDB) console.log(getDBData(name, info, infoDB)); 添加或更新數據 async function setDBData(data,storeName "storeName",dbName "dbName",version ) {c…

educoder中Hive綜合應用案例 — 用戶搜索日志分析

第1關:2018年點擊量最高的10個網站域名 ---------- 禁止修改 ----------drop database if exists mydb cascade; ---------- 禁止修改 -------------------- begin ---------- ---創建mydb數據庫 create database mydb;---使用mydb數據庫 use mydb;---創建表db_search create…