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

哪些情況會(huì)導(dǎo)致?MySQL?索引失效

 更新時(shí)間:2022年07月05日 10:04:14   作者:??Java中文社群????  
這篇文章主要介紹了哪些情況會(huì)導(dǎo)致MySQL索引失效,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下

前言

為了驗(yàn)證 MySQL 中哪些情況下會(huì)導(dǎo)致索引失效,我們可以借助 explain 執(zhí)行計(jì)劃來分析索引失效的具體場(chǎng)景。

explain 使用如下,只需要在查詢的 SQL 前面添加上 explain 關(guān)鍵字即可,如下圖所示: 

 而以上查詢結(jié)果的列中,我們最主要觀察 key 這一列,key 這一列表示實(shí)際使用的索引,如果為 NULL 則表示未使用索引,反之則使用了索引。

以上所有結(jié)果列說明如下:

  • id — 選擇標(biāo)識(shí)符,id 越大優(yōu)先級(jí)越高,越先被執(zhí)行;
  • select_type — 表示查詢的類型;
  • table — 輸出結(jié)果集的表;
  • partitions — 匹配的分區(qū);
  • type — 表示表的連接類型;
  • possible_keys — 表示查詢時(shí),可能使用的索引;
  • key — 表示實(shí)際使用的索引;
  • key_len — 索引字段的長度;
  • ref— 列與索引的比較;
  • rows — 大概估算的行數(shù);
  • filtered — 按表?xiàng)l件過濾的行百分比;
  • Extra — 執(zhí)行情況的描述和說明。

其中最重要的就是 type 字段,type 值類型如下:

  • all — 掃描全表數(shù)據(jù);
  • index — 遍歷索引;
  • range — 索引范圍查找;
  • index_subquery — 在子查詢中使用 ref;
  • unique_subquery — 在子查詢中使用 eq_ref;
  • ref_or_null — 對(duì) null 進(jìn)行索引的優(yōu)化的 ref;
  • fulltext — 使用全文索引;
  • ref — 使用非唯一索引查找數(shù)據(jù);
  • eq_ref — 在 join 查詢中使用主鍵或唯一索引關(guān)聯(lián);

const — 將一個(gè)主鍵放置到 where 后面作為條件查詢, MySQL 優(yōu)化器就能把這次查詢優(yōu)化轉(zhuǎn)化為一個(gè)常量,如何轉(zhuǎn)化以及何時(shí)轉(zhuǎn)化,這個(gè)取決于優(yōu)化器,這個(gè)比 eq_ref 效率高一點(diǎn)。

創(chuàng)建測(cè)試表和數(shù)據(jù)

為了演示和測(cè)試那種情況下會(huì)導(dǎo)致索引失效,我們先創(chuàng)建一個(gè)測(cè)試表和相應(yīng)的數(shù)據(jù):

-- 創(chuàng)建表
drop table if exists student;
create table student(
  id int primary key auto_increment comment '主鍵',
  sn varchar(32) comment '學(xué)號(hào)',
  name varchar(250) comment '姓名',
  age int comment '年齡',
  sex bit comment '性別',
  address varchar(250) comment '家庭地址',
  key idx_address (address),
  key idx_sn_name_age (sn,name,age)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 添加測(cè)試數(shù)據(jù)
insert into student(id,sn,name,age,sex,address)
  values(1,'cn001','張三',18,1,'高老莊'),
  (2,'cn002','李四',20,0,'花果山'),
  (3,'cn003','王五',50,1,'水簾洞');

當(dāng)前表中總共有 3 個(gè)索引,如下圖所示: 

PS:本文以下內(nèi)容基于 MySQL 5.7 InnoDB 數(shù)據(jù)引擎下。

索引失效情況1:非最左匹配

最左匹配原則指的是,以最左邊的為起點(diǎn)字段查詢可以使用聯(lián)合索引,否則將不能使用聯(lián)合索引。 我們本文的聯(lián)合索引的字段順序是 sn + name + age,我們假設(shè)它們的順序是 A + B + C,以下聯(lián)合索引的使用情況如下: 

 從上述結(jié)果可以看出,如果是以最左邊開始匹配的字段都可以使用上聯(lián)合索引,比如:

  • A+B+C
  • A+B
  • A+C

其中:A 等于字段 sn,B 等于字段 name,C 等于字段 age。

而 B+C 卻不能使用到聯(lián)合索引,這就是最左匹配原則。

索引失效情況2:錯(cuò)誤模糊查詢

模糊查詢 like 的常見用法有 3 種:

  • 模糊匹配后面任意字符:like '張%'
  • 模糊匹配前面任意字符:like '%張'
  • 模糊匹配前后任意字符:like '%張%'

而這 3 種模糊查詢中只有第 1 種查詢方式可以使用到索引,具體執(zhí)行結(jié)果如下: 

索引失效情況3:列運(yùn)算

如果索引列使用了運(yùn)算,那么索引也會(huì)失效,如下圖所示: 

索引失效情況4:使用函數(shù)

查詢列如果使用任意 MySQL 提供的函數(shù)就會(huì)導(dǎo)致索引失效,比如以下列使用了 ifnull 函數(shù)之后的執(zhí)行計(jì)劃如下: 

索引失效情況5:類型轉(zhuǎn)換

如果索引列存在類型轉(zhuǎn)換,那么也不會(huì)走索引,比如 address 為字符串類型,而查詢的時(shí)候設(shè)置了 int 類型的值就會(huì)導(dǎo)致索引失效,

如下圖所示: 

索引失效情況6:使用 is not null

當(dāng)在查詢中使用了 is not null 也會(huì)導(dǎo)致索引失效,而 is null 則會(huì)正常觸發(fā)索引的,

如下圖所示: 

總結(jié)

導(dǎo)致 MySQL 索引失效的常見場(chǎng)景有以下 6 種:

  • 聯(lián)合索引不滿足最左匹配原則。
  • 模糊查詢最前面的為不確定匹配字符。
  • 索引列參與了運(yùn)算。
  • 索引列使用了函數(shù)。
  • 索引列存在類型轉(zhuǎn)換。
  • 索引列使用 is not null 查詢。

到此這篇關(guān)于哪些情況會(huì)導(dǎo)致 MySQL 索引失效的文章就介紹到這了,更多相關(guān)MySQL 索引失效內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • CentOS7.x卸載與安裝MySQL5.7的操作過程及編碼格式的修改方法

    CentOS7.x卸載與安裝MySQL5.7的操作過程及編碼格式的修改方法

    這篇文章主要介紹了CentOS7.x卸載與安裝MySQL5.7的操作過程及編碼格式的修改方法,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-05-05
  • MySQL分庫分表id主鍵處理方式

    MySQL分庫分表id主鍵處理方式

    文章主要討論了在分庫分表后如何生成全局唯一的ID,包括基于數(shù)據(jù)庫的實(shí)現(xiàn)方案、UUID、獲取系統(tǒng)當(dāng)前時(shí)間和Snowflake算法,并對(duì)其優(yōu)缺點(diǎn)和適用場(chǎng)景進(jìn)行了分析
    2025-02-02
  • 重置MySQL 8.0 Root密碼的簡(jiǎn)便方法小結(jié)

    重置MySQL 8.0 Root密碼的簡(jiǎn)便方法小結(jié)

    這篇文章主要給大家介紹了幾種輕松重置 MySQL 8.0 Root 密碼的簡(jiǎn)便方法,文中通過代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-10-10
  • mysql datetime查詢異常問題解決

    mysql datetime查詢異常問題解決

    這篇文章主要介紹了mysql datetime查詢異常問題解決的相關(guān)資料,這里對(duì)異常進(jìn)行了詳細(xì)的介紹和該如何解決,需要的朋友可以參考下
    2016-11-11
  • mysql與mysqli的區(qū)別與用法說明

    mysql與mysqli的區(qū)別與用法說明

    mysql是非持繼連接函數(shù)而mysqli是永遠(yuǎn)連接函數(shù)。
    2010-07-07
  • Mysql使用Sharding-JDBC配置教程

    Mysql使用Sharding-JDBC配置教程

    文章介紹了如何使用Sharding-JDBC對(duì)訂單表進(jìn)行水平分表,并通過配置分片規(guī)則、數(shù)據(jù)操作和測(cè)試驗(yàn)證了分表的實(shí)現(xiàn),同時(shí),文章還討論了Sharding-JDBC的多種集成方式和4種分片策略的實(shí)現(xiàn)方法,包括標(biāo)準(zhǔn)分片策略、復(fù)合分片策略、行表達(dá)式分片策略和Hint分片策略
    2025-02-02
  • MySQL中having和where的區(qū)別及應(yīng)用詳解

    MySQL中having和where的區(qū)別及應(yīng)用詳解

    這篇文章主要給大家詳細(xì)介紹了MySQL中having和where的區(qū)別以及他們的使用方法,文中有相關(guān)的代碼示例,具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-06-06
  • MySQL5.7.23解壓版安裝教程圖文詳解

    MySQL5.7.23解壓版安裝教程圖文詳解

    這篇文章主要介紹了MySQL5.7.23解壓版安裝教程圖文詳解,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-06-06
  • MySQL中使用去重distinct方法的示例詳解

    MySQL中使用去重distinct方法的示例詳解

    這篇文章主要介紹了MySQL中使用去重distinct方法的示例詳解。distinct用來查詢不重復(fù)記錄的條數(shù),distinct表示對(duì)后面的所有參數(shù)的拼接取 不重復(fù)的記錄,即查出的參數(shù)拼接每行記錄都是唯一的。地產(chǎn)感興趣的可以了解一下
    2020-07-07
  • MySQL修改配置 區(qū)分大小寫

    MySQL修改配置 區(qū)分大小寫

    修改MySql Server安裝目錄下的 my.ini 文件,在mysqld節(jié)下加入下面一行 set-variable=lower_case_table_names=0 (0:大小寫敏感;1:大小寫不敏感)最后重啟一下MySql服務(wù)即可。
    2010-12-12

最新評(píng)論

蓝山县| 宜黄县| 礼泉县| 泾源县| 平乡县| 平定县| 南部县| 虞城县| 高淳县| 安龙县| 健康| 弥渡县| 香河县| 屏边| 舞阳县| 稷山县| 娄烦县| 高唐县| 台东市| 武鸣县| 涞水县| 谢通门县| 沁源县| 五家渠市| 宁津县| 凭祥市| 江川县| 木兰县| 宿迁市| 故城县| 西贡区| 噶尔县| 古浪县| 奈曼旗| 万源市| 新巴尔虎右旗| 镶黄旗| 汉阴县| 万源市| 苏尼特右旗| 安图县|