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

mysql索引失效的常見九種原因圖文詳解

 更新時間:2022年06月01日 11:33:58   作者:book多得  
索引失效這個問題的前提應(yīng)該是建立了索引,卻沒有使用到,或者沒有完全使用到,下面這篇文章主要給大家介紹了關(guān)于mysql索引失效的常見九種原因的相關(guān)資料,需要的朋友可以參考下

前言:

MySQL中提高性能的一個最有效的方式是對數(shù)據(jù)表設(shè)計合理的索引。索引提供了高效訪問數(shù)據(jù)的方法,并且加快查詢的速度, 因此索引對查詢的速度有著至關(guān)重要的影響。

  • 使用索引可以快速地定位表中的某條記錄,從而提高數(shù)據(jù)庫查詢的速度,提高數(shù)據(jù)庫的性能。
  • 如果查詢時沒有使用索引,查詢語句就會掃描表中的所有記錄。在數(shù)據(jù)量大的情況下,這樣查詢的速度會很慢。

大多數(shù)情況下都(默認(rèn))采用B+ 樹來構(gòu)建索引。只是空間列類型的索引使R- 樹,并且MEMORY 表還支持hash 索引。其實,用不用索引最終都是優(yōu)化器說了算。

優(yōu)化器是基于什么的優(yōu)化器? 基于cost開銷(CostBaseOptimizer) ,它不是基于規(guī)則( Rule-BasedOptimizer),也不是基于語義。怎么樣開銷小就怎么來。另外, SQL 語句是否使用索引,跟數(shù)據(jù)庫版本、數(shù)據(jù)量、數(shù)據(jù)選擇度都有關(guān)系

1.最佳左前綴法則

拓展: Alibaba Java 開發(fā)手冊》 索引文件具有 B-Tree 的最左前綴匹配特性,如果左邊的值未確定,那么無法使用此索引。

2.主鍵插入順序

 如果此時再插入一條主鍵值為 9 的記錄,那它插入的位置就如下圖:

可這個數(shù)據(jù)頁已經(jīng)滿了,再插進來咋辦呢?我們需要把當(dāng)前 頁面分裂 成兩個頁面,把本頁中的一些記錄移動到新創(chuàng)建的這個頁中。頁面分裂和記錄移位意味著什么?意味著: 性能損耗 !所以如果我們想盡量 避免這樣無謂的性能損耗,最好讓插入的記錄的 主鍵值依次遞增 ,這樣就不會發(fā)生這樣的性能損耗了。         

所以我們建議:讓主鍵具有 AUTO_INCREMENT ,讓存儲引擎自己為表生成主鍵, 在插入記錄時存儲引擎會自動為我們填入自增的主鍵值。這樣的主鍵占用空間小,順序?qū)懭?,減少頁分裂。

3.計算、函數(shù)、類型轉(zhuǎn)換(自動或手動)導(dǎo)致索引失效

4.范圍條件右邊的列索引失效

例子:

#創(chuàng)建一個聯(lián)合索引, 注意字段的順序
create index idx_age_classid_name on student(age,classid,name);
#執(zhí)行計劃
EXPLAIN SELECT SQL_NO_CACHE * FROM student
WHERE student .age = 30 AND student .classId > 20 AND student .name = 'abc' ;  

#再創(chuàng)建一個聯(lián)合索引,與上面的索引對比字段順序變了
create index idx_age_name_classid on student(age,name,classid); 

#再執(zhí)行一模一樣的執(zhí)行計劃
EXPLAIN SELECT SQL_NO_CACHE * FROM student
WHERE student .age = 30 AND student .classId > 20 AND student .name = 'abc' ;

 看到兩個執(zhí)行計劃雖然都用到了索引,但是:

  • 第一個沒用全,只用到了聯(lián)合索引“idx_age_classid_name” 的age和classid。
  • 第二個把聯(lián)合索引“idx_age_name_classid”的age,name和classid都用上了。

5.不等于(!= 或者<>)導(dǎo)致索引失效

6.is null可以使用索引,is not null無法使用索引

7.like以通配符%開頭索引失效

拓展: Alibaba 《Java 開發(fā)手冊》 【強制】頁面搜索嚴(yán)禁左模糊或者全模糊,如果需要請走搜索引擎來解決。

8.OR 前后只要存在非索引的列,都會導(dǎo)致索引失效 

9.數(shù)據(jù)庫和表的字符集統(tǒng)一使用utf8mb4         

統(tǒng)一使用utf8mb4( 5.5.3 版本以上支持 ) 兼容性更好,統(tǒng)一字符集可以避免由于字符集轉(zhuǎn)換產(chǎn)生的亂碼。不同的 字符集 進行比較前需要進行 轉(zhuǎn)換 會造成索引失效。

總結(jié)

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

相關(guān)文章

  • Mysql經(jīng)典高逼格/命令行操作(速成)(推薦)

    Mysql經(jīng)典高逼格/命令行操作(速成)(推薦)

    這篇文章主要介紹了Mysql命令行操作,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • MySQL中增刪改查操作與常見陷阱詳解

    MySQL中增刪改查操作與常見陷阱詳解

    這篇文章詳細(xì)講解了MySQL的增刪改查的語句、語義和一些我們經(jīng)常在開發(fā)工作中暴露的問題,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-11-11
  • mysql5.7.18安裝時提示無法找到入口問題的解決方法

    mysql5.7.18安裝時提示無法找到入口問題的解決方法

    這篇文章主要為大家詳細(xì)介紹了mysql5.7.18安裝時出現(xiàn)無法找到入口問題的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • MySQL創(chuàng)建用戶以及用戶權(quán)限詳細(xì)圖文教程

    MySQL創(chuàng)建用戶以及用戶權(quán)限詳細(xì)圖文教程

    在MySQL中可以通過創(chuàng)建用戶來管理數(shù)據(jù)庫的訪問權(quán)限,下面這篇文章主要給大家介紹了關(guān)于MySQL創(chuàng)建用戶以及用戶權(quán)限的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • 修改mysql允許主機訪問的權(quán)限方法

    修改mysql允許主機訪問的權(quán)限方法

    默認(rèn)mysql的用戶是沒有遠(yuǎn)程訪問的權(quán)限的,因此當(dāng)程序跟數(shù)據(jù)庫不在同一臺服務(wù)器上時,我們需要開啟mysql的遠(yuǎn)程訪問權(quán)限,下面通過本文給大家分享修改mysql允許主機訪問的權(quán)限的方法,感興趣的朋友一起看看吧
    2017-07-07
  • centos7中如何利用crontab進行mysql定時備份

    centos7中如何利用crontab進行mysql定時備份

    crontab是一個命令,常見于Unix和類Unix的操作系統(tǒng)之中,用于設(shè)置周期性被執(zhí)行的指令,下面這篇文章主要給大家介紹了關(guān)于centos7中如何利用crontab進行mysql定時備份的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • mysql最新版8.0.17解壓版安裝教程

    mysql最新版8.0.17解壓版安裝教程

    這篇文章主要為大家詳細(xì)介紹了最新版mysql 8.0.17 解壓版安裝教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • MYSQL中EXISTS的用法小結(jié)

    MYSQL中EXISTS的用法小結(jié)

    在MySQL數(shù)據(jù)庫中,EXISTS是一種強大的工具,用于處理復(fù)雜的查詢需求,本文主要介紹了MYSQL中EXISTS的用法小結(jié),具有一定的參考價值,感興趣的可以了解一下
    2024-05-05
  • MySQL百萬級數(shù)據(jù)大分頁查詢優(yōu)化的實現(xiàn)

    MySQL百萬級數(shù)據(jù)大分頁查詢優(yōu)化的實現(xiàn)

    在數(shù)據(jù)庫開發(fā)過程中我們經(jīng)常會使用分頁,但是如果是百萬級數(shù)據(jù)呢,本文就詳細(xì)的介紹一下MySQL百萬級數(shù)據(jù)大分頁查詢優(yōu)化的實現(xiàn),感興趣的可以了解一下
    2022-01-01
  • MySQL 截取字符串函數(shù)的sql語句

    MySQL 截取字符串函數(shù)的sql語句

    這篇文章主要介紹了MySQL 截取字符串函數(shù)的sql語句,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2018-04-04

最新評論