mysql索引下推和索引失效

索引下推:

ICP過濾的條件可以不限于用于索引查找(index lookup)的字段。只要存儲引擎在掃描當前索引時能夠訪問到該字段的值,就可以用它來過濾。

索引可以分為聚簇索引和非聚簇索引

沒有索引下推:

當使用聚簇索引的時候,b+樹的葉子結點就是數據項,但是如果沒有索引下推的話,即使數據中已經可以拿到其余的數據項,但是仍然不會進行過濾

例如where name = 張% and age < 30,只在name上有聚簇索引

即使在存儲引擎根據name查詢得到的數據是完整的數據,可以拿到age字段的值,但是仍然不會對age條件進行過濾

使用非聚簇索引的時候,b+樹的葉子結點是主鍵索引的值,例如一個聯合索引(a,b,c),如果只匹配到a,那么即使where條件中有c的條件,也不會在這個時候進行過濾,只會根據a的索引得到所有主鍵id,然后返回給服務器,服務器再根據主鍵id去查詢所有數據,返回到服務層再進行過濾,這個過程就是回表

有索引下推:

會將where的條件下推到存儲引擎層,存儲引擎層就會利用自己所能獲得的數據更多的進行過濾

同樣上面兩個例子:

如果是聚簇索引的話,存儲引擎可以得到完整的數據,就可以在這個時候根據age字段進行過濾,將過濾之后的數據返回給服務器層

如果是非聚簇索引的話,在聯合索引(a,b,c)中雖然只匹配到a的索引,但是可以獲得c字段的值,也可以通過where中c的值進行過濾,返回更少的主鍵id給服務器層去進行回表

索引失效:

就是明明可以使用索引來提升效率但是沒用上索引

1.索引類型不匹配

例如索引age的數據類型是整數類型,但是查詢的時候使用的是age = '20'

這樣就會導致隱式類型轉換,導致無法使用age上的索引

2.使用函數表達式

age上有索引,但是使用的是where f(age) = 30,索引無法生效

3.進行運算

age有索引,但是where age + 20 < 30,這樣的運算實際也會導致索引失效

雖然后面mysql優化可以給帶運算的字段加索引,但是不是一定生效的

4.like查詢且以通配符(如 %_)開頭時

name上有索引,但是like '%張'會導致name上的索引失效,但是like '張%'可以用上索引

5.or條件

or兩側是同一個索引:索引生效

or兩側是多個索引:優化器通常會評估索引之間的效率,選擇其中一個索引使用或者全表搜索,如果有索引合并的話,會分別將索引查找的集合進行union合并

6.not in和not like

NOT IN 的否定性質使其難以利用索引的有序性進行快速定位(B+樹的優勢在于快速找到“等于”或“在某個范圍內”的值),但它仍然可以利用索引進行掃描,但是不是利用索引查詢

not in的時候如果范圍內有null的話,會導致查不到數據

7.在聯合索引中,如果前導索引是范圍查詢,后續索引不會生效

比如聯合索引(a,b),如果是where a>10 and b = 20;只會匹配到索引a,索引b不會生效

對not in的改進:

例如:

  • 表?users:有 10000 個用戶,id?是主鍵(有索引)。
  • 表?banned_users:有 10 個被封禁的用戶,user_id?列有索引

1.使用not in

SELECT * FROM users 
WHERE id NOT IN (SELECT user_id FROM banned_users);

如果banned_users中存在一條user_id為null的記錄的話,那這條查詢就會出問題,查不到任何數據

2.使用not exists

SELECT * FROM users u
WHERE NOT EXISTS (SELECT 1 FROM banned_users b WHERE b.user_id = u.id
);

實際上對user表也是全表檢索的,但是如果banned_users的user_id有索引的話可以用上這個的索引

3.使用left join

SELECT u.*
FROM users u
LEFT JOIN banned_users b ON u.id = b.user_id
WHERE b.user_id IS NULL;

左連接以左邊的表為主,把右邊的表按照u.id=b.user_id拼過來,如果不存在b.user_id的話,就是null

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

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

相關文章

【電賽學習筆記】MaixCAM 的OCR圖片文字識別

前言 本文是對MaixPy官方文檔 MaixCAM MaixPy 實現 OCR 圖片文字識別 - MaixPy 的項目實踐整理與拓展&#xff0c;侵權即刪。 功能介紹 OCR是MaixCAM中功能強大的數字文字識別模塊&#xff0c;可以做到輕松的識別各種數字與文字。 OCR官方例程解析 工程源碼 from maix im…

如何在生成式引擎優化(GEO)中取得成功

如果你希望您的內容出現在 AI Overviews、ChatGPT 和 Gemini 中&#xff1f;以下是設置 GEO 廣告系列的方法。 任何好的 GEO 活動的第一步是創造一些東西實際上想要鏈接到或引用。 GEO 策略組件 想象一些你合理預期不會直接在 ChatGPT 或類似系統中找到的體驗&#xff1a; 例如…

WPFC#超市管理系統(3)商品管理

超市管理系統6. 商品管理6.1 添加商品6.1 商品管理主界面6.3 修改商品6. 商品管理 將前文中的GoodsView全部改成和數據庫一致的ProductView新增枚舉類型商品類型ProductType.cs namespace 超市管理系統.Enums {public enum ProductType{水果類,休閑食品類,糧油類,飲料類,日用…

openwrt中br-lan,eth0,eth0.1,eth0.2

CPU是QCA9558 有兩個以太網接口 這個好像沒有外接交換機直接印出來的 openwrt中br-lan,eth0,eth0.1,eth0.2 https://blog.csdn.net/f2157120/article/details/119460852 這個哥用的是 鏈接: DomyWifi DW33D 路由器 CPU是QCA9558 有兩個以太網接口 因為CPU沒集成千兆交換&…

RAG實戰指南 Day 29:RAG系統成本控制與規模化

【RAG實戰指南 Day 29】RAG系統成本控制與規模化 開篇 歡迎來到"RAG實戰指南"系列的第29天&#xff01;今天我們將深入探討RAG系統的成本控制與規模化部署策略。當RAG系統從原型階段進入生產環境時&#xff0c;如何經濟高效地擴展系統規模、控制運營成本成為關鍵挑…

React 中獲取當前路由信息

在 React 中獲取當前路由信息&#xff0c;根據使用的路由庫不同&#xff08;如 React Router v5/v6 或 Next.js&#xff09;&#xff0c;方法也有所區別。以下是常見場景的解決方案&#xff1a;1. 使用 React Router v6 獲取當前路徑&#xff08;pathname&#xff09;、查詢參數…

Sklearn 機器學習 隨機森林 網格搜索獲取最優參數

??親愛的技術愛好者們,熱烈歡迎來到 Kant2048 的博客!我是 Thomas Kant,很開心能在CSDN上與你們相遇~?? 本博客的精華專欄: 【自動化測試】 【測試經驗】 【人工智能】 【Python】 Sklearn 機器學習:隨機森林 + 網格搜索獲取最優參數實戰指南 在構建機器學習模型時,…

力扣-101.對稱二叉樹

題目鏈接 101.對稱二叉樹 class Solution {public boolean check(TreeNode l, TreeNode r) {if (l null && r null)return true;if ((l null && r ! null) || (r null && l ! null))return false;if (l.val ! r.val)return false;return check(l…

從句--02-1--done,doing ,prep 做定語

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄定語1.done&#xff08;過去分詞&#xff09;做定語一、過去分詞作定語的位置二、過去分詞作定語的語義特點三、過去分詞作定語與現在分詞作定語的區別四、過去分詞作…

JVM全面解析

摘要&#xff1a;JVM是Java程序運行的核心環境&#xff0c;負責解釋執行字節碼并管理內存。其核心功能包括類加載與驗證、字節碼執行優化、內存管理與垃圾回收&#xff08;GC&#xff09;、跨平臺支持及安全性保障。JVM架構包含程序計數器、虛擬機棧、本地方法棧、堆和方法區等…

SDC命令詳解:使用write_script命令進行輸出

相關閱讀 SDC輸出命令https://blog.csdn.net/weixin_45791458/category_12993272.html?spm1001.2014.3001.5482 write_script命令用于將設計中的屬性設置命令輸出為腳本文件&#xff08;其實它并不是一個SDC命令&#xff0c;歸為此類只是為了方便管理&#xff09;&#xff0c…

?CASE WHEN THEN ELSE END?

?CASE WHEN THEN ELSE END? 是SQL中實現條件邏輯的核心表達式&#xff0c;支持單字段匹配和多條件判斷&#xff0c;適用于數據處理、分類統計等場景。?基本語法形式?SQL中CASE表達式有兩種標準形式&#xff1a;1? 簡單CASE表達式?&#xff08;字段直接匹配&#xff09;C…

飛單誘因:管理漏洞與人性交織

飛單看似是 “員工個人行為”&#xff0c;實則是餐廳管理、激勵機制、外部環境等多重因素共同作用的結果。要根治飛單&#xff0c;需先理清背后的 “動力源”—— 員工為何選擇冒險&#xff1f;一、“收入失衡”&#xff1a;薪資與付出不匹配的 “補償心理”基層員工&#xff0…

工作筆記-----FreeRTOS中的lwIP網絡任務為什么會讓出CPU

工作筆記-----FreeRTOS中的lwIP網絡任務為什么會讓出CPU Author: 明月清了個風Date&#xff1a; 2025.7.30Ps:最近接觸了在FreeRTOS中使用lwIP實現的網絡任務&#xff0c;但是在看項目代碼的過程中出現了一些疑問——網絡任務的優先級為所有任務中最高的&#xff0c;并且任務框…

在 CentOS 系統上安裝 Docker

在 CentOS 系統上安裝 Docker&#xff0c;可按以下步驟操作&#xff1a;一、卸載舊版本&#xff08;如存在&#xff09;bashsudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-…

【CVPR2025】FlowRAM:用區域感知與流匹配加速高精度機器人操作策略學習

文章目錄FlowRAM&#xff1a;用區域感知與流匹配加速高精度機器人操作策略學習一、問題出在哪里&#xff1f;方法部分&#xff1a;從結構到機制&#xff0c;詳解 FlowRAM 的內部設計邏輯1. 動態半徑調度器&#xff1a;自適應注意力機制在 3D 感知中的實現2. 多模態編碼器與序列…

圖片查重從設計到實現(5)Milvus可視化工具

要通過網頁&#xff08;Web&#xff09;訪問和管理 Milvus 向量數據庫&#xff0c;可以使用官方提供的 Milvus Web UI 工具&#xff0c;這是一款可視化管理界面&#xff0c;支持查看集合、向量數據、執行基本操作等功能。以下是具體的部署和訪問方法&#xff1a; 一、部署 Milv…

Linux-awk與sed

文章目錄一、AWK1. awk 是什么&#xff1f;2. awk 的基礎語法2.1 選項2.2 模式2.3 動作3. awk 的內置變量4. 典型應用場景及示例4.1 打印特定列4.2 條件篩選4.3 使用正則表達式4.4 統計行數4.5 字段操作4.6 使用內置函數4.7 多文件處理4.8 使用自定義變量5. 高級應用&#xff1…

文件加密工具(勒索病毒加密方式)

語言&#xff1a;C# WPF功能&#xff1a;文件加/解密本程序不提供下載&#xff0c;該程序新手操作不當&#xff0c;可能會導致文件加密后無法解密問題&#xff0c;解密需要獨立私鑰private.key文件支持&#xff0c;沒有私鑰加密文件是無法被解密的。更新&#xff1a;2025年7月3…

IOC實現原理源碼解析

Spring三級緩存流程圖singletonObjects&#xff08;一級緩存&#xff09;&#xff1a;緩存經過了完整生命周期的Bean&#xff1b;arlySingletonobjects&#xff08;二級緩存&#xff09;&#xff1a;緩存未經過完整生命周期的Bean&#xff0c;如果某個Bean出現了循環依賴&#…