3-002: MySQL 中使用索引一定有效嗎?如何排查索引效果?

1. 索引失效的常見原因

雖然索引可以加速查詢,但在某些情況下,MySQL 可能不會使用索引,甚至使用索引反而更慢
以下是一些常見導致索引失效的原因:

① 查詢條件使用了 != 或 <>
  • 原因:索引通常用于范圍或等值查詢,而 != 無法高效利用 B+ 樹索引。

  • 示例

    SELECT * FROM users WHERE age != 30;
    
    • 失效原因!= 使 MySQL 需要掃描大量行,索引無法高效過濾。
② OR 連接多個條件,但只有部分字段有索引
  • 示例

    SELECT * FROM users WHERE age = 30 OR name = 'Alice';
    
    • 失效原因:如果 name 字段沒有索引,MySQL 可能選擇 全表掃描 而不是使用 age 的索引。
  • 優化方法:為 name 字段也添加索引,或者拆分查詢:

      SELECT * FROM users WHERE age = 30
    UNION
    SELECT * FROM users WHERE name = 'Alice';
    
③ LIKE 以 % 開頭
  • 示例

    SELECT * FROM users WHERE name LIKE '%Alice%';
    
    • 失效原因:B+ 樹索引按照前綴匹配,以 % 開頭無法使用索引。

    • 優化方法:

      • 如果 name需要前綴匹配,可以使用

        前綴索引:

        CREATE INDEX idx_name ON users(name(3)); -- 僅索引前3個字符
        
      • 或者改用,全文索引:

        ALTER TABLE users ADD FULLTEXT(name);
        SELECT * FROM users WHERE MATCH(name) AGAINST('Alice');
        
④ 隱式類型轉換
  • 示例

    SELECT * FROM users WHERE phone = 13800001234;  -- phone 是 VARCHAR 類型
    
    • 失效原因phoneVARCHAR,但查詢時寫成 INT,MySQL 進行隱式轉換,導致索引失效。

    • 優化方法:使用正確的數據類型:

         
      SELECT * FROM users WHERE phone = '13800001234';
      
⑤ IS NULL 或 IS NOT NULL
  • 示例

    SELECT * FROM users WHERE address IS NULL;
    
    • 失效原因:B+ 樹索引不存儲 NULL 值,查詢 NULL 可能導致索引失效。
  • 優化方法

    • 避免 NULL 值,改用默認值:

      ALTER TABLE users MODIFY address VARCHAR(255) NOT NULL DEFAULT '';
      
    • 使用 col IS NOT NULL 可能仍然走索引(視索引情況而定)。

⑥ 低選擇性字段
  • 示例

    • 失效原因gender 只有 malefemale,選擇性低,索引加速效果不明顯,MySQL 可能選擇全表掃描。
  • 優化方法

    • 索引一般適用于高選擇性字段,如 idemail

    • 如果 gender 需要頻繁查詢,可以考慮

      聯合索引,例如:

      CREATE INDEX idx_gender_age ON users(gender, age);
      

      這樣,查詢 WHERE gender = 'male' AND age > 30時仍能利用索引。


2. 如何排查索引效果?

可以使用 EXPLAIN 命令分析 SQL 是否走索引,以及索引的效率。

① 使用 EXPLAIN 分析 SQL 執行計劃
EXPLAIN SELECT * FROM users WHERE age = 30;

返回示例:

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1SIMPLEusersrefidx_ageidx_age4const10Using index
  • type = ref:表示使用了索引。
  • key = idx_age:表示使用了 age 索引。
  • rows = 10:表示掃描了 10 行數據,索引效果較好。

如果 type = ALL,表示全表掃描,說明索引可能失效!


② SHOW INDEX FROM table_name 查看索引
SHOW INDEX FROM users;

查看表 users 上的索引信息,確認索引是否創建正確。


③ ANALYZE TABLE & OPTIMIZE TABLE

如果表數據更新較多,索引可能變得不高效,可以手動優化:

ANALYZE TABLE users;  -- 更新索引統計信息
OPTIMIZE TABLE users; -- 重建索引

總結

影響索引使用的因素是否會導致索引失效解決方案
!= / < >? 失效改用 BETWEENIN
OR 但部分字段無索引? 失效拆分查詢或為所有字段加索引
LIKE '%xxx%'? 失效改用前綴索引或全文索引
類型轉換? 失效確保查詢和字段類型一致
IS NULL? 可能失效使用默認值替代 NULL
低選擇性索引? 可能失效使用聯合索引提高選擇性
EXPLAIN 顯示 ALL? 失效重新設計索引或優化 SQL

使用 EXPLAIN + SHOW INDEX + ANALYZE TABLE 等工具,可以有效排查 MySQL 索引是否生效,并進行優化。


希望這份索引優化指南對你有幫助!如果有任何疑問,歡迎繼續探討 😊🚀

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

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

相關文章

LVGL移植到6818開發板

一、移植步驟 1.lv_config.h 配置文件啟動 framebuffer 2、lv_config.h 配置文件關閉SDL 2.修改main.c 去掉SDL輸入設備 3.修改Makefile 文件啟動交叉編譯 去掉警告參數 去掉SDL庫 4.交叉編譯代碼 make clean #清空 ? 必須要清空一次再編譯&#xff01; 因為修改了 lv_con…

linux系統命令——權限

一、有哪些權限 讀&#xff08;r&#xff09;——對應數字4 寫&#xff08;w&#xff09;——對應數字2 執行&#xff08;x&#xff09;——對應數字1 二、權限及數字的對應 4對應r-- 2對應-w- 1對應--x 5對應r-x 6對應rw- 7對應rwx 三、文件的基本屬性 如圖&#…

Android Dagger2 框架輔助工具模塊深度剖析(六)

一、引言 在 Android 開發領域&#xff0c;依賴注入&#xff08;Dependency Injection&#xff0c;簡稱 DI&#xff09;作為一種至關重要的設計模式&#xff0c;能顯著降低代碼間的耦合度&#xff0c;提升代碼的可測試性與可維護性。Dagger2 作為一款強大的依賴注入框架&#…

Django項目之訂單管理part3

一.前言 前面兩章已經把登錄給做完了&#xff0c;這一章節要說的是登錄的校驗和登錄以后的菜單展示&#xff0c;內容還是很多的。 二.菜單和權限 2.1 是否登錄 當我們進入其他的頁面&#xff0c;我們首先要判斷是否登錄&#xff0c;這個時候我們就要借助中間件來做session和…

多線程到底重不重要?

我們先說一下為什么要講多線程和高并發&#xff1f; 原因是&#xff0c;你想拿到一個更高的薪水&#xff0c;在面試的時候呈現出了兩個方向的現象&#xff1a; 第一個是上天 項目經驗高并發 緩存 大流量 大數據量的架構設計 第二個是入地 各種基礎算法&#xff0c;各種基礎…

AI大模型測試用例生成平臺

AI測試用例生成平臺 項目背景技術棧業務描述項目展示項目重難點 項目背景 針對傳統接口測試用例設計高度依賴人工經驗、重復工作量大、覆蓋場景有限等行業痛點&#xff0c;基于大語言模型技術實現接口測試用例智能生成系統。 技術棧 LangChain框架GLM-4模型Prompt Engineeri…

【論文筆記】Contrastive Learning for Compact Single Image Dehazing(AECR-Net)

文章目錄 問題創新網絡主要貢獻Autoencoder-like Dehazing NetworkAdaptive Mixup for Feature PreservingDynamic Feature Enhancement1. 可變形卷積的使用2. 擴展感受野3. 減少網格偽影4. 融合空間結構信息 Contrastive Regularization1. 核心思想2. 正樣本對和負樣本對的構建…

異步加載錯誤如何解決

首先是 提供兩張圖 如果數據過多的情況下我在所內和住家形式頻繁的來回切換 導致數據展示的不一樣 大家是不是有這樣的問題 這個是導致了數據展示有問題的情況 住家的情況本來是沒有幾層的 下面我幫大家解決一下 // 防止異步延遲 const Noop () > { } const lhl (resDa…

編譯支持 RKmpp 和 RGA 的 ffmpeg 源碼

一、前言 RK3588 支持VPU硬件解碼&#xff0c;需要rkmpp進行調用&#xff1b;支持2D圖像加速&#xff0c;需要 RGA 進行調用。 這兩個庫均能通過 ffmpeg-rockchip 進行間接調用&#xff0c;編譯時需要開啟對應的功能。 二、依賴安裝 編譯ffmpeg前需要編譯 rkmpp 和 RGA&#xf…

數據科學/數據分析暑期實習題目匯總

文章目錄 1. 孤立森林算法2. python私有屬性代碼解釋1. 類的定義2. 構造方法 `__init__`3. 創建類的實例4. 訪問私有屬性總結python列表拷貝代碼示例與分析內存地址不同的原因驗證對其中一個列表修改不會影響另一個列表記錄一些值得記錄的題目。 1. 孤立森林算法 異常點判斷的…

Java多線程與高并發專題——原子類和 volatile、synchronized 有什么異同?

原子類和 volatile異同 首先&#xff0c;通過我們對原子類和的了解&#xff0c;原子類和volatile 都能保證多線程環境下的數據可見性。在多線程程序中&#xff0c;每個線程都有自己的工作內存&#xff0c;當多個線程訪問共享變量時&#xff0c;可能會出現一個線程修改了共享變…

207、【圖論】孤島的總面積

題目 思路 相比于 206、【圖論】島嶼數量&#xff0c;就是在這個代碼的基礎上。先遍歷邊界&#xff0c;將邊界連接的島嶼變為0&#xff0c;然后再計算一遍當前為1的島嶼面積。 代碼實現 import collectionsn, m list(map(int, input().split())) graph []for _ in range(n…

大模型最新面試題系列:微調篇之微調基礎知識

一、全參數微調&#xff08;Full-Finetune&#xff09; vs 參數高效微調&#xff08;PEFT&#xff09;對比 1. 顯存使用差異 全參數微調&#xff1a;需存儲所有參數的梯度&#xff08;如GPT-3 175B模型全量微調需約2.3TB顯存&#xff09;PEFT&#xff1a;以LoRA為例&#xff…

【GPT入門】第21課 langchain核心組件

【GPT入門】第21課 langchain核心組件 1. langchain 核心組件2.文檔加載器 Document loader3.文檔處理器3.1 langchain_text_splitters3.3 FAISS向量數據庫和向量檢索主要作用應用場景4. 對話歷史管理1. langchain 核心組件 模型 I/O 封裝 LLMs:大語言模型 Chat Models:一般…

應急響應靶機練習-Linux2

1.背景 前景需要&#xff1a;看監控的時候發現webshell告警&#xff0c;領導讓你上機檢查你可以救救安服仔嗎&#xff01;&#xff01; 挑戰內容&#xff1a; &#xff08;1&#xff09;提交攻擊者IP &#xff08;2&#xff09;提交攻擊者修改的管理員密碼(明文) &#xff08;…

分享一個免費的CKA認證學習資料

關于CKA考試 CKA&#xff08;Certified Kubernetes Administrator&#xff09;是CNCF基金會&#xff08;Cloud Native Computing Foundation&#xff09;官方推出的Kubernetes管理員認證計劃&#xff0c;用于證明持有人有履行Kubernetes管理的知識&#xff0c;技能等相關的能力…

【PTA題目解答】7-2 簡化的插入排序(15分)

1.題目 本題要求編寫程序&#xff0c;將一個給定的整數插到原本有序的整數序列中&#xff0c;使結果序列仍然有序。 輸入格式&#xff1a; 輸入在第一行先給出非負整數N&#xff08;<10&#xff09;&#xff1b;第二行給出N個從小到大排好順序的整數&#xff1b;第三行給…

【最新】 ubuntu24安裝 1panel 保姆級教程

系統&#xff1a;ubuntu24.04.1 安裝軟件 &#xff1a;1panel 第一步&#xff1a;更新系統 sudo apt update sudo apt upgrade 如下圖 第二步&#xff1a;安裝1panel&#xff0c;運行如下命令 curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o …

UE4-UE5虛幻引擎,前置學習一--Console日志輸出經常崩潰,有什么好的解決辦法

有些差異 這么牛逼的引擎&#xff0c;居然有這種入門級別的問題&#xff0c;一觸發清理&#xff0c;大概率(80%)會崩潰 無論虛幻5還是UE4都有這個問題&#xff0c;挺煩人的 實在忍不了了&#xff0c;這次&#xff0c;今天 就想問問有什么好的處理方法么&#xff1f;&#x…

【微服務】Nacos 配置動態刷新(簡易版)(附配置)

文章目錄 1、實現方法2、配置依賴 yaml3、驗證效果 1、實現方法 環境&#xff1a;Nacos、Java、SpringBoot等 主要是在boostrap.yaml中的data-id屬性下配置refresh:true來實現動態更新 2、配置依賴 yaml 具體的版本參考官方的說明&#xff1a;官方版本說明 <!--讀取boo…