亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

前言

在MySQL的查詢優(yōu)化中,索引是一項至關(guān)重要的技術(shù),它能夠大大提升數(shù)據(jù)檢索的效率。本文將討論這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)建聯(lián)合索引。
    --創(chuàng)建聯(lián)合索引
    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; 
    
  • 原理:計算和函數(shù)操作會改變數(shù)據(jù)的表現(xiàn)形式,索引無法直接應(yīng)用。這個查詢中,使用了 YEAR(order_date) 函數(shù)來提取 order_date 字段的年份,與 2024 進行比較。
  • 解決方案:1.改為直接存儲處理后的數(shù)據(jù)。2.直接改為當前字段的范圍查詢。
    --范圍查詢
    SELECT * FROM orders WHERE order_date >= '2024-01-01' AND order_date < '2025-01-01';
    --直接存儲處理后的數(shù)據(jù)
    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. 對索引字段進行類型轉(zhuǎn)換

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

5. LIKE 頭部模糊查詢

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

6. NULL 值的查詢

  • 例子
    SELECT * FROM users WHERE age IS NULL; 
    
  • 原理:索引對 NULL 值的查詢支持有限,可能無法高效利用。
  • 解決方案:避免頻繁查詢 NULL 值,或者為包含 NULL 值的字段設(shè)計專門的索引、將 NULL值替換為其他默認值。
    -- 使用IFNULL() 函數(shù)
    SELECT * FROM users WHERE IFNULL(age, -1) = -1;
    -- 使用COALESCE() 函數(shù)
    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 操作需要去重或聚合數(shù)據(jù)。這些操作不能直接利用索引來返回唯一結(jié)果,通常會導致數(shù)據(jù)庫掃描整個表(即全表掃描),尤其是在沒有合適索引的情況下。
  • 解決方案:使用合適的索引(例如 GROUP BY 列上創(chuàng)建索引),或者將查詢分解成多個步驟。
    --創(chuàng)建索引
    CREATE INDEX idx_users_age ON users(age);
    SELECT age, COUNT(*) FROM users GROUP BY age;
    
    --子查詢獲取去重結(jié)果集再查詢
    SELECT age, COUNT(*) 
    FROM users 
    WHERE age IN (
        SELECT DISTINCT age 
        FROM users 
        WHERE age IS NOT NULL
    )
    GROUP BY age;
    

8. JOIN 查詢中沒有適當?shù)乃饕?/h2>
  • 例子
    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 JOINLEFT JOIN 或其他連接類型可以影響查詢性能,選擇最合適的連接方式可以幫助優(yōu)化性能。

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

  • 例子
    SELECT * FROM users ORDER BY name DESC,age ASC; 
    
  • 原理:如果索引的順序與查詢的排序要求不匹配,可能無法利用索引。
  • 解決方案:確保查詢的排序方式與索引的順序一致,使用復(fù)合索引支持多種排序需求。
    -- 創(chuàng)建復(fù)合索引
    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'; 
    
  • 原理:連接順序不當可能導致某些表的索引無法使用,從而降低查詢性能。
  • 解決方案:根據(jù)數(shù)據(jù)量和索引設(shè)計優(yōu)化 JOIN 順序。
    -- 使用子查詢(篩選大表后再去連接)
    SELECT * FROM 
    (SELECT * FROM orders WHERE order_date > '2024-01-01') o
    JOIN users u ON u.id = o.user_id;
    -- 小表驅(qū)動大表(如果users表有100條,orders有20萬數(shù)據(jù))
    -- 使用 STRAIGHT_JOIN 強制左表為驅(qū)動表
    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,讓數(shù)據(jù)庫自動選擇最優(yōu)索引。

總結(jié)

在 SQL 查詢優(yōu)化中,合適的索引設(shè)計和查詢結(jié)構(gòu)調(diào)整是提高性能的關(guān)鍵。通過以下措施可以避免常見的性能瓶頸:

  • 使用適當?shù)乃饕齺砑铀?nbsp;DISTINCT、GROUP BY、JOIN 和 ORDER BY 操作。
  • 優(yōu)化連接順序,確保合理使用索引。
  • 避免強制使用或禁用索引,允許查詢優(yōu)化器自動選擇最優(yōu)執(zhí)行計劃。

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

相關(guān)文章

  • 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在關(guān)聯(lián)復(fù)雜情況下所能做出的一些優(yōu)化

    MySQL在關(guān)聯(lián)復(fù)雜情況下所能做出的一些優(yōu)化

    這篇文章主要介紹了MySQL在關(guān)聯(lián)復(fù)雜情況下所能做出的一些優(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 二進制最新安裝的相關(guān)資料,需要的朋友可以參考下
    2017-10-10
  • SQL?中?HAVING?常見的使用方法

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

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

    詳解MySQL導出指定表中的數(shù)據(jù)的實例

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

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

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

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

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

    Mysql中的嵌套子查詢問題

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

最新評論