欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL進階之路索引失效的11種情況詳析

 更新時間:2025年03月01日 15:08:45   作者:ajsbxi  
這篇文章主要介紹了MySQL查詢優(yōu)化中的11種常見情況,包括索引的使用和優(yōu)化策略,通過這些策略,開發(fā)者可以顯著提升查詢性能,需要的朋友可以參考下

前言

在MySQL的查詢優(yōu)化中,索引是一項至關重要的技術,它能夠大大提升數據檢索的效率。本文將討論這11種常見情況,幫助開發(fā)者更好地理解索引的使用及優(yōu)化。

圖示

在這里插入圖片描述

1. 使用不等式操作符(!=, <, >)

  • 例子
    SELECT * FROM users WHERE age != 30; 
    
  • 原理:索引通常用于等值查詢(=)或范圍查詢(><),不等式操作無法有效利用索引。
  • 解決方案:避免使用不等式條件,改用范圍查詢。
    SELECT * FROM users WHERE age NOT BETWEEN 30 AND 30;
    SELECT * FROM users WHERE`age > 30`AND`age < 30;
    

2. 使用 OR 連接多個條件

  • 例子
    SELECT * FROM users WHERE age = 30 OR gender = 'male'; 
    
  • 原理OR 會導致多個獨立查詢,尤其當每個條件涉及不同列時,索引不會完全失效,會快速定位有索引列部分,無索引列進行全部掃描。
  • 解決方案:使用 UNION 替代 OR、創(chuàng)建聯合索引。
    --創(chuàng)建聯合索引
    create index idx_users_age_gender on users(age,gender);
    SELECT * FROM users WHERE age = 30 OR gender = 'male'; 
    --使用UNION合并子查詢
    SELECT * FROM users WHERE age = 30
    UNION
    SELECT * FROM users WHERE gender = 'male';
    

3. 對索引字段進行計算操作

  • 例子
    SELECT * FROM orders WHERE YEAR(order_date) = 2024; 
    
  • 原理:計算和函數操作會改變數據的表現形式,索引無法直接應用。這個查詢中,使用了 YEAR(order_date) 函數來提取 order_date 字段的年份,與 2024 進行比較。
  • 解決方案:1.改為直接存儲處理后的數據。2.直接改為當前字段的范圍查詢。
    --范圍查詢
    SELECT * FROM orders WHERE order_date >= '2024-01-01' AND order_date < '2025-01-01';
    --直接存儲處理后的數據
    ALTER TABLE orders add column order_year INT; -- 新增字段 order_year
    UPDATE orders SET order_year = YEAR(order_date); 
    SELECT * FROM orders WHERE order_year = 2024;
    

4. 對索引字段進行類型轉換

  • 例子
    SELECT * FROM users WHERE CAST(age AS CHAR) = '30'; 
    
  • 原理:類型轉換會導致數據類型與索引數據類型不匹配,索引失效。
  • 解決方案:確保查詢條件的數據類型與索引數據類型一致,避免使用類型轉換。

5. LIKE 頭部模糊查詢

  • 例子
    SELECT * FROM users WHERE name LIKE '%john';   
    
  • 原理LIKE 查詢以 % 開頭時,索引無法使用,因為數據庫無法提前確定匹配的范圍。
  • 解決方案:避免在 LIKE 查詢中使用前綴 %,改為 LIKE 'john%'
    SELECT * FROM users WHERE name LIKE 'john%';   
    

6. NULL 值的查詢

  • 例子
    SELECT * FROM users WHERE age IS NULL; 
    
  • 原理:索引對 NULL 值的查詢支持有限,可能無法高效利用。
  • 解決方案:避免頻繁查詢 NULL 值,或者為包含 NULL 值的字段設計專門的索引、將 NULL值替換為其他默認值。
    -- 使用IFNULL() 函數
    SELECT * FROM users WHERE IFNULL(age, -1) = -1;
    -- 使用COALESCE() 函數
    SELECT * FROM users WHERE COALESCE(age, -1) = -1;
    --使用 NOT NULL 約束,修改字段默認值為 0
    ALTER TABLE users MODIFY age NOT NULL DEFAULT 0;
    

7. DISTINCT 或 GROUP BY 操作

  • 例子
    SELECT DISTINCT age FROM users;
    SELECT age, COUNT(*) FROM users GROUP BY age;
    
  • 原理DISTINCT 和 GROUP BY 操作需要去重或聚合數據。這些操作不能直接利用索引來返回唯一結果,通常會導致數據庫掃描整個表(即全表掃描),尤其是在沒有合適索引的情況下。
  • 解決方案:使用合適的索引(例如 GROUP BY 列上創(chuàng)建索引),或者將查詢分解成多個步驟。
    --創(chuàng)建索引
    CREATE INDEX idx_users_age ON users(age);
    SELECT age, COUNT(*) FROM users GROUP BY age;
    
    --子查詢獲取去重結果集再查詢
    SELECT age, COUNT(*) 
    FROM users 
    WHERE age IN (
        SELECT DISTINCT age 
        FROM users 
        WHERE age IS NOT NULL
    )
    GROUP BY age;
    

8. JOIN 查詢中沒有適當的索引

  • 例子
    SELECT * FROM users u JOIN orders o ON u.id = o.user_id; 
    
  • 原理:如果連接條件沒有索引,JOIN 查詢可能會導致全表掃描。
  • 解決方案:為連接字段創(chuàng)建索引,確保連接操作高效執(zhí)行。
    CREATE INDEX idx_user_id ON orders(user_id);
    CREATE INDEX idx_user_id_users ON users(id);
    
  • 使用合適的連接類型:在某些情況下,使用 INNER JOIN、LEFT JOIN 或其他連接類型可以影響查詢性能,選擇最合適的連接方式可以幫助優(yōu)化性能。

9. 排序(ORDER BY)與索引不匹配

  • 例子
    SELECT * FROM users ORDER BY name DESC,age ASC; 
    
  • 原理:如果索引的順序與查詢的排序要求不匹配,可能無法利用索引。
  • 解決方案:確保查詢的排序方式與索引的順序一致,使用復合索引支持多種排序需求。
    -- 創(chuàng)建復合索引
    CREATE INDEX idx_name_age ON users(name DESC, age ASC); 
    SELECT * FROM users ORDER BY name DESC, age ASC;
    

10. 表連接順序不當

  • 例子
    SELECT * FROM users u JOIN orders o ON u.id = o.user_id WHERE o.order_date > '2024-01-01'; 
    
  • 原理:連接順序不當可能導致某些表的索引無法使用,從而降低查詢性能。
  • 解決方案:根據數據量和索引設計優(yōu)化 JOIN 順序。
    -- 使用子查詢(篩選大表后再去連接)
    SELECT * FROM 
    (SELECT * FROM orders WHERE order_date > '2024-01-01') o
    JOIN users u ON u.id = o.user_id;
    -- 小表驅動大表(如果users表有100條,orders有20萬數據)
    -- 使用 STRAIGHT_JOIN 強制左表為驅動表
    SELECT * 
    FROM users u
    STRAIGHT_JOIN orders o ON u.id = o.user_id
    WHERE o.order_date > '2024-01-01';
    

11. 啟用 NO_INDEX 或 FORCE INDEX 提示時的索引失效

  • 例子
    SELECT * FROM users FORCE INDEX (idx_name) WHERE age = 30;
    
  • 原理:強制索引或禁止索引可能導致查詢優(yōu)化器無法選擇最優(yōu)的執(zhí)行計劃。
  • 解決方案:避免使用 FORCE INDEX 或 NO_INDEX,讓數據庫自動選擇最優(yōu)索引。

總結

在 SQL 查詢優(yōu)化中,合適的索引設計和查詢結構調整是提高性能的關鍵。通過以下措施可以避免常見的性能瓶頸:

  • 使用適當的索引來加速 DISTINCT、GROUP BY、JOIN 和 ORDER BY 操作。
  • 優(yōu)化連接順序,確保合理使用索引。
  • 避免強制使用或禁用索引,允許查詢優(yōu)化器自動選擇最優(yōu)執(zhí)行計劃。

到此這篇關于MySQL進階之路索引失效的11種情況的文章就介紹到這了,更多相關MySQL索引失效情況內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Ubuntu10下如何搭建MySQL Proxy讀寫分離探討

    Ubuntu10下如何搭建MySQL Proxy讀寫分離探討

    MySQL Proxy是一個處于你的Client端和MySQL server端之間的簡單程序,它可以監(jiān)測、分析或改變它們的通信
    2012-11-11
  • Windows 下 MySQL 8.X 的安裝教程

    Windows 下 MySQL 8.X 的安裝教程

    這篇文章主要介紹了Windows 下 MySQL 8.X 的安裝教程,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-11-11
  • MySQL在關聯復雜情況下所能做出的一些優(yōu)化

    MySQL在關聯復雜情況下所能做出的一些優(yōu)化

    這篇文章主要介紹了MySQL在關聯復雜情況下所能做出的一些優(yōu)化,作者通過添加索引來不斷優(yōu)化查詢時間,需要的朋友可以參考下
    2015-05-05
  • Linux下安裝mysql-5.6.4 的圖文教程

    Linux下安裝mysql-5.6.4 的圖文教程

    在開始安裝前,先說明一下mysql-5.6.4與較低的版本在安裝上的區(qū)別,從mysql-5.5起,mysql源碼安裝開始使用cmake了,因此當我們配置安裝目錄./configure --perfix=/.....的時候和以前的會有些區(qū)別,這點我們稍后會提到
    2013-06-06
  • mysql 5.7.19 二進制最新安裝

    mysql 5.7.19 二進制最新安裝

    這篇文章主要介紹了mysql 5.7.19 二進制最新安裝的相關資料,需要的朋友可以參考下
    2017-10-10
  • SQL?中?HAVING?常見的使用方法

    SQL?中?HAVING?常見的使用方法

    這篇文章主要介紹了SQL中HAVING常見的使用方法,文章通過圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • 詳解MySQL導出指定表中的數據的實例

    詳解MySQL導出指定表中的數據的實例

    這篇文章主要介紹了詳解MySQL導出指定表中的數據的實例的相關資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • Mysql查詢以某"字符串"開頭的查詢方式

    Mysql查詢以某"字符串"開頭的查詢方式

    這篇文章主要介紹了Mysql查詢以某"字符串"開頭的查詢方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 在linux或unix服務器上安裝、使用MySQL的注意事項

    在linux或unix服務器上安裝、使用MySQL的注意事項

    在linux或unix服務器上安裝、使用MySQL的注意事項,需要的朋友可以參考下,使用windows服務器的朋友可以到s.jb51.net下載相關軟件
    2012-01-01
  • Mysql中的嵌套子查詢問題

    Mysql中的嵌套子查詢問題

    這篇文章主要介紹了Mysql嵌套子查詢,子查詢就是指的在一個完整的查詢語句之中,嵌套若干個不同功能的小查詢,從而一起完成復雜查詢的一種編寫形式,為了讓讀者更加清楚子查詢的概念,感興趣的朋友跟隨小編一起看看吧
    2022-01-01

最新評論