最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL索引失效的原因及問題排查

 更新時間:2024年04月26日 10:40:18   作者:山腳ice  
MySQL索引失效是指在查詢數(shù)據(jù)時,MySQL數(shù)據(jù)庫無法有效地使用索引來提高查詢性能,導(dǎo)致查詢速度變慢或者索引無效的情況,本文給大家介紹了MySQL中什么情況下會出現(xiàn)索引失效?以及如何排查索引失效?,需要的朋友可以參考下

1-引言:什么是MySQL的索引失效?(What、Why)

1-1 索引失效定義

  • 在MySQL中,索引是用來加快檢索數(shù)據(jù)庫記錄的一種數(shù)據(jù)結(jié)構(gòu)
  • 索引失效指的是在進行查詢操作時,本應(yīng)該使用索引來提升查詢效率的場景下,數(shù)據(jù)庫沒有利用索引,而是采用了全表掃描的方式,這會大大增加查詢時間和系統(tǒng)負擔。

1-2 為什么排查索引失效

排查索引失效的原因是至關(guān)重要的,主要有以下方面:

  • 1. 提高查詢效率:索引的主要目的是加快數(shù)據(jù)檢索速度。當索引失效時,數(shù)據(jù)庫系統(tǒng)可能退回到更慢的查詢方法,如全表掃描,這會顯著增加查詢時間和降低整體性能。
  • 2. 降低服務(wù)器負載:使用索引可以顯著減少數(shù)據(jù)庫處理查詢所需處理的數(shù)據(jù)量,從而減少CPU使用率和IO讀寫。如果索引失效,數(shù)據(jù)庫必須加載更多數(shù)據(jù),這會增加服務(wù)器的負載和資源消耗。

2- 索引失效的原因及排查(How)

2-1 索引失效的情況

  • 以以下的學(xué)生信息表舉例
CREATE TABLE `student_info` (
  `student_id` int(11) NOT NULL AUTO_INCREMENT,
  `student_name` varchar(50) NOT NULL,
  `student_age` int(11) DEFAULT NULL,
  `enrollment_date` datetime DEFAULT NULL,
  PRIMARY KEY (`student_id`),
  UNIQUE KEY `student_name` (`student_name`),
  KEY `student_age` (`student_age`),
  KEY `enrollment_date` (`enrollment_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  • 表的索引情況:
  • 總結(jié)來說,表 student_info 有四個字段上定義了索引:
    • 一個主鍵索引 student_id
    • 一個唯一索引 student_name
    • 以及兩個普通索引 student_age 和 enrollment_date。

image.png

① 索引列參與計算

  • 正常的通過 age 去做查詢
    • 走的是 student_age 的索引
explain select * from student_info where student_age=21;

image.png

  • 如果索引列參與了計算進行查詢
    • 索引失效
explain select * from student_info where student_age+1 =21;

image.png

  • 如果不是對列進行計算,而是對列等號右側(cè)的值進行計算,結(jié)果還是走索引的。

image.png

② 對索引列進行函數(shù)操作

  • 正常的查詢——>走索引
explain select * from student_info where enrollment_date = '2022-09-04 08:00:00';

image.png

  • 如果對查詢的字段加上函數(shù)操作時,索引失效
explain select * from student_info where YEAR(enrollment_date) = 2022;

image.png

③ 查詢中使用了 OR 兩邊有范圍查詢 > 或 <

  • 正常情況查詢,查詢使用 student_name 索引
explain select * from student_info where student_name='Helen' and student_age>15;

image.png

  • 如果使用了 OR 進行查詢,兩邊包含范圍查詢 > 或 <
    • 此時索引失效
explain select * from student_info where student_name='Helen' or student_age>15;

image.png

  • 如果沒有范圍查詢下使用 OR 還是正常走索引
explain select * from student_info where student_name='Helen' or student_age=18;

image.png

④ like 操作:以 % 開頭的 like 查詢

  • 以 % 開頭的 LIKE 查詢比如 LIKE ‘%abc’;;

⑤ 不等于比較 !=

  • 在MySQL中 != 比較有可能會導(dǎo)致不走索引,但如果對 id 進行 != 比較,是有可能走索引的。
  • != 比較是否走索引,與索引的選擇、數(shù)據(jù)分布情況有關(guān),不單是由于查詢包含 != 而引起的。

⑥ order by

  • 如果使用 order by 時,表中的數(shù)據(jù)量很小,數(shù)據(jù)庫會直接在內(nèi)存中進行排序,而不使用索引

image.png

⑦ 使用 IN

  • 使用 IN 的時候,有可能走索引,也有可能不走索引。當在 IN 的取值范圍比較大的時候有可能會導(dǎo)致索引失效,走全表掃描(NOT IN 和 IN的失效場景相同)。

2-2 索引失效的排查

使用 explain 排查

  • 和 MySQL 慢查詢的排查類似,使用 Explain 語句來進行排查。

需要關(guān)注的字段:type、key、extra

  • 我們可以根據(jù) key、type、extra 來判斷一條語句是否走了索引。
  • 一般走索引的情況 :
    • key 值不為 null
    • type 值應(yīng)該為 ref、eq_ref、range、const 這幾個
    • extra 的話如果是 NULL,或者 using indedx,using index condition 都是可以的

索引失效情況

  • 如果一條語句出現(xiàn)了 type 值為 all、key 為 nullextra = Using where 此時是索引失效了

此時就需要排查索引失效的原因

  • 索引是否符合最左前綴匹配

  • 查詢語句出現(xiàn)以上 7 種情況

3- 總結(jié):索引失效知識點小結(jié)

MySQL中什么情況下會出現(xiàn)索引失效?如何排查索引失效?
回答
:::info
MySQL中索引失效的情況有

    1. 比如聯(lián)合索引在查詢的過程中不符合最左前綴原則,此時聯(lián)合索引會失效
    1. 查詢的語句 索引列 進行計算,此時會使得索引失效
    1. 查詢的語句 對索引列進行了函數(shù)操作,比如利用了 **YEAR()** 函數(shù)
    1. 查詢語句中 包含 **OR** ,且 OR 兩側(cè)有范圍查詢 也就是 **>** 或 **<** 此時索引會失效
    1. 查詢語句中 使用了 **like** 且 **like** 中存在 以**%** 開頭的匹配,此時索引會失效
    1. 查詢語句中 使用了 **!=** 進行比較,但這種情況也和數(shù)據(jù)的分布情況有關(guān)系,
    1. 當數(shù)據(jù)表中的數(shù)據(jù)較少,使用 **order by** 的時候,可能會不走索引直接在內(nèi)存中進行排序
    1. 當使用 **IN**** **時候取值范圍比較大的時候有可能會導(dǎo)致索引失效

索引失效的排查

  • ① 使用 Explain 對 SQL 語句進行排查
  • 需要 關(guān)注的字段有 **type****key**、**extra**
  • 如果一條語句出現(xiàn)了 type 值為 all、key 為 null,extra = Using where 此時是索引失效了

此時就需要排查索引失效的原因,是否存在以上情況

以上就是MySQL索引失效的原因及問題排查的詳細內(nèi)容,更多關(guān)于MySQL索引失效的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Mysql覆蓋索引詳解

    Mysql覆蓋索引詳解

    今天小編就為大家分享一篇關(guān)于Mysql覆蓋索引詳解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • MySQL8設(shè)置自動創(chuàng)建時間和自動更新時間的實現(xiàn)方法

    MySQL8設(shè)置自動創(chuàng)建時間和自動更新時間的實現(xiàn)方法

    在實際應(yīng)用中,我們時常會需要用到創(chuàng)建時間和更新時間這兩個字段,下面這篇文章主要給大家介紹了關(guān)于MySQL8設(shè)置自動創(chuàng)建時間和自動更新時間的實現(xiàn)方法,需要的朋友可以參考下
    2023-03-03
  • MySQL 權(quán)限控制細節(jié)分析

    MySQL 權(quán)限控制細節(jié)分析

    這篇文章主要介紹了MySQL 權(quán)限控制細節(jié)分析的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用MySQL,感興趣的朋友可以了解下
    2021-03-03
  • 千萬級用戶系統(tǒng)SQL調(diào)優(yōu)實戰(zhàn)分享

    千萬級用戶系統(tǒng)SQL調(diào)優(yōu)實戰(zhàn)分享

    這篇文章主要介紹了千萬級用戶系統(tǒng)SQL調(diào)優(yōu)實戰(zhàn)分享,用戶日活百萬級,注冊用戶千萬級,而且若還沒有進行分庫分表,則該DB里的用戶表可能就一張,單表上千萬的用戶數(shù)據(jù),下面我們就來學(xué)習(xí)如何讓優(yōu)化,需要的朋友可以參考一下
    2022-03-03
  • SQL?Group?By分組后如何選取每組最新的一條數(shù)據(jù)

    SQL?Group?By分組后如何選取每組最新的一條數(shù)據(jù)

    經(jīng)常在分組查詢之后,需要的是分組的某行數(shù)據(jù),例如更新時間最新的一條數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于SQL?Group?By分組后如何選取每組最新的一條數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • MySQL表的增刪改查(CRUD)

    MySQL表的增刪改查(CRUD)

    這篇文章主要介紹了如何對數(shù)據(jù)庫增刪改查,想要更全面了解的小伙伴,可以詳細閱讀本文
    2023-03-03
  • Mysql元數(shù)據(jù)如何生成Hive建表語句注釋腳本詳解

    Mysql元數(shù)據(jù)如何生成Hive建表語句注釋腳本詳解

    這篇文章主要給大家介紹了關(guān)于Mysql元數(shù)據(jù)如何生成Hive建表語句注釋腳本的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08
  • Mysql如何獲取json字符串/數(shù)組的值

    Mysql如何獲取json字符串/數(shù)組的值

    這篇文章主要介紹了Mysql如何獲取json字符串/數(shù)組的值問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 史上最簡單的MySQL數(shù)據(jù)備份與還原教程(上)(三十五)

    史上最簡單的MySQL數(shù)據(jù)備份與還原教程(上)(三十五)

    這篇文章主要為大家詳細介紹了史上最簡單的MySQL數(shù)據(jù)備份與還原教程第一篇,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • MySQL系列之十一 日志記錄

    MySQL系列之十一 日志記錄

    這篇文章主要介紹了MySQL日志文件詳解,本文分別講解了錯誤日志、二進制日志、通用查詢?nèi)罩尽⒙樵內(nèi)罩?、Innodb的在線redo日志、更新日志等日志類型和作用介紹,需要的朋友可以參考下
    2021-07-07

最新評論

赣榆县| 柘荣县| 东阳市| 莎车县| 茂名市| 台南县| 汪清县| 南陵县| 赣州市| 将乐县| 萍乡市| 曲松县| 晋宁县| 福泉市| 都江堰市| 凤翔县| 五峰| 衡山县| 津市市| 崇阳县| 红桥区| 白银市| 金溪县| 临江市| 炎陵县| 乌拉特后旗| 安多县| 宁武县| 弥渡县| 昌图县| 赤壁市| 台江县| 新平| 和平县| 阿坝县| 邢台县| 鞍山市| 福鼎市| 江西省| 贞丰县| 陵川县|