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

淺談mysql哪些情況會(huì)導(dǎo)致索引失效

 更新時(shí)間:2021年11月18日 16:22:04   作者:海南小黑仔  
索引在我們使用MySQL數(shù)據(jù)庫時(shí)可以極大的提高查詢效率,然而,有時(shí)候因?yàn)槭褂蒙系囊恍╄Υ镁蜁?huì)導(dǎo)致索引的失效,無法達(dá)到我們使用索引的預(yù)期效果,本文就介紹一下幾種索引失效的方法

下面有一些培訓(xùn)教學(xué)機(jī)構(gòu)的口訣和我個(gè)人的一些總結(jié):
為了講解以下索引內(nèi)容,我們先建立一個(gè)臨時(shí)的表 test02

CREATE TABLE `sys_user` (
  `id` varchar(64) NOT NULL COMMENT '主鍵',
  `name` varchar(64) DEFAULT NULL COMMENT '名字',
  `age` int(64) DEFAULT NULL COMMENT '年齡',
  `pos` varchar(64) DEFAULT NULL COMMENT '職位',
  PRIMARY KEY (`id`),
  KEY `idx_sys_user_nameAgePos` (`name`,`age`,`pos`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用戶表';

這個(gè)表有四個(gè)字段 主鍵 、名字、年齡、職位

下面我們來講解第一個(gè)口訣:
1.全值匹配我最愛
2.最佳左前綴法則(重要)

全值匹配意思就是聯(lián)立的復(fù)合索引的順序和個(gè)數(shù)要和檢索的條件順序和個(gè)數(shù)相同。
最佳左前綴法則是指,如果索引了多列,要遵守最左前綴法則。指的是查詢從索引的最左前列開始并且不跳過索引中的列
下面我們給這個(gè)表建立一個(gè)復(fù)合索引

ALTER TABLE sys_user ADD INDEX idx_sys_user_nameAgePos(name,age,pos);

以下是我們的檢索語句:

SELECT * FROM sys_user WHERE name='小明' AND age = 22 AND pos ='java';

在這里插入圖片描述

我們通過在檢索語句前面加關(guān)鍵字 EXLAIN,可以知道是否使用的索引

(1)EXPLAIN SELECT * FROM sys_user WHERE name='小明' AND age = 22 AND pos ='java';
(2)EXPLAIN SELECT * FROM sys_user WHERE name='小明' AND age = 22 ;
(3)EXPLAIN SELECT * FROM sys_user WHERE name='小明'  AND pos ='java';

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

通過展示的結(jié)果我們可以知道,第一個(gè)復(fù)合索引的三個(gè)字段我們都用了,第二個(gè)復(fù)合索引我們只用到兩個(gè)字段,第三個(gè)復(fù)合索引我們只用到一個(gè)字段。三個(gè)語句我們都用到索引,顯然第一種是最優(yōu)的。

我們再看看哪種情況會(huì)失效:

(4)EXPLAIN SELECT * FROM sys_user WHERE age = 22;
(5)EXPLAIN SELECT * FROM sys_user WHERE pos ='java';
(6)EXPLAIN SELECT * FROM sys_user WHERE age = 22 AND pos ='java';

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

以上三種情況都變成了全表掃描,原因是違反了最左左前綴原則,因?yàn)閺?fù)合索引最左邊的是name,當(dāng)檢索條件name沒在前面索引將失效,第一種情況滿足了全值匹配,第二種滿足了兩個(gè)字段name和age,第三種因?yàn)橹粷M足了name,所以索引只用到name。

3.不在索引列上做任何操作(計(jì)算、函數(shù)(自動(dòng)或手動(dòng))類型轉(zhuǎn)換),會(huì)使索引失效轉(zhuǎn)為全表掃描

(7)EXPLAIN SELECT * FROM sys_user WHERE  LEFT(name,1)='小明';

在這里插入圖片描述

第七種情況失效是因?yàn)樗饕凶隽擞?jì)算或者函數(shù)的操作,導(dǎo)致了全表掃描。

4.存儲(chǔ)引擎不能使用索引中范圍條件右邊的列
可能大家關(guān)看上面的文字不知道是什么意思,下面我們執(zhí)行一下查詢語句就清楚了

(8)EXPLAIN SELECT * FROM sys_user WHERE name='小明' AND age < 22 AND pos ='java';

在這里插入圖片描述

從上圖我們可以知道type變成了范圍級別,也就是說age<22之后的pos字段的索引失效了。

5.盡量使用覆蓋索引(只訪問索引的查詢(索引列和查詢列一致),減少select * 的使用
這個(gè)就是字面意思,查詢具體的字段比查詢*效率更高,下面我們坐一下對比

(9)EXPLAIN SELECT * FROM sys_user WHERE name='小明' AND age =22 AND pos ='java';
(10)EXPLAIN SELECT name,age,pos FROM sys_user WHERE name='小明' AND age =22 AND pos ='java';

在這里插入圖片描述

在這里插入圖片描述

6.mysql在使用不等于(!= 或者<>)的時(shí)候無法使用索引會(huì)導(dǎo)致全表掃描
(!= 或者<>)通常會(huì)匹配到大量數(shù)據(jù),當(dāng)使用索引的花銷大于全表掃描時(shí),mysql則會(huì)放棄使用索引而選擇全表掃描

(11)EXPLAIN SELECT * FROM sys_user WHERE name !='小明'

在這里插入圖片描述

結(jié)果顯示索引失效導(dǎo)致了全表掃描

7.is null,is not null 也無法使用索引
is null,is not null 通常會(huì)匹配到大量數(shù)據(jù),當(dāng)使用索引的花銷大于全表掃描時(shí),mysql則會(huì)放棄使用索引而選擇全表掃描

(12)EXPLAIN SELECT * FROM sys_user WHERE name is not null

在這里插入圖片描述

8.like以通配符開頭('%abc…')mysql索引會(huì)失效變成全表掃描的操作,(%寫右邊則可以避免索引失效,如果業(yè)務(wù)實(shí)在需要'%abc…%'則可以用覆蓋索引避免索引失效)

(13)EXPLAIN SELECT * FROM sys_user WHERE name like '%明%'
(14)EXPLAIN SELECT * FROM sys_user WHERE name like '明%'
(15)EXPLAIN SELECT name,age,pos FROM sys_user WHERE name like '%明%'

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

從上面的結(jié)果,第一種索引失效,第二種只寫右邊的%則可以避免索引失效,第三種如果業(yè)務(wù)實(shí)在需要‘%abc…%'這種sql,則可以用覆蓋索引解決索引失效的問題

9.字符串不加單引號索引會(huì)失效

(16)EXPLAIN SELECT * FROM sys_user WHERE name=222;

在這里插入圖片描述

因?yàn)闄z索字符串是必須加單引號,上面用用了222是int類型,mysql在檢索的時(shí)候會(huì)判斷name是varchar的類型會(huì)將222轉(zhuǎn)換為'222'進(jìn)行檢索,索引列發(fā)生了類型轉(zhuǎn)換,故索引失效。

10.少用or,用它連接時(shí)會(huì)索引失效

(16)EXPLAIN SELECT * FROM sys_user WHERE name='小明' or age = 22;

在這里插入圖片描述

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

相關(guān)文章

  • MySQL數(shù)據(jù)庫基本SQL語句教程之高級操作

    MySQL數(shù)據(jù)庫基本SQL語句教程之高級操作

    對MySQL數(shù)據(jù)庫的查詢,除了基本的查詢外,有時(shí)候需要對查詢的結(jié)果集進(jìn)行處理,下面這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫基本SQL語句教程之高級操作的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • MySQL btree索引與hash索引區(qū)別

    MySQL btree索引與hash索引區(qū)別

    這篇文章主要介紹了MySQL btree索引與hash索引區(qū)別,幫助大家更好的理解和學(xué)習(xí)MySQL索引的相關(guān)知識(shí),感興趣的朋友可以了解下
    2020-09-09
  • MySQL邏輯備份的實(shí)現(xiàn)步驟

    MySQL邏輯備份的實(shí)現(xiàn)步驟

    本文主要介紹了MySQL邏輯備份的實(shí)現(xiàn)步驟,包括使用mysqldump和mysqlpump工具進(jìn)行備份和恢復(fù),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • MySQL性能優(yōu)化之路---修改配置文件my.cnf

    MySQL性能優(yōu)化之路---修改配置文件my.cnf

    mysql數(shù)據(jù)庫的優(yōu)化,算是一個(gè)老生常談的問題了,網(wǎng)上也有很多關(guān)于各方面性能優(yōu)化的例子,今天我們要談的是MySQL 系統(tǒng)參數(shù)的優(yōu)化即優(yōu)化my.cnf文件
    2014-06-06
  • MySQL利用UNION連接2個(gè)查詢排序失效詳解

    MySQL利用UNION連接2個(gè)查詢排序失效詳解

    這篇文章主要給大家介紹了關(guān)于MySQL利用UNION連接2個(gè)查詢排序失效的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Mysql中的Datetime和Timestamp比較

    Mysql中的Datetime和Timestamp比較

    這篇文章主要介紹了Mysql中的Datetime和Timestamp比較,本文總結(jié)了它們的相同點(diǎn)和不同點(diǎn)以及時(shí)間格式介紹等,需要的朋友可以參考下
    2015-03-03
  • mysql下centos安裝mariadb的方法及遇到的問題

    mysql下centos安裝mariadb的方法及遇到的問題

    這篇文章主要介紹了mysql下centos安裝mariadb的方法及遇到的問題,在安裝之前要?jiǎng)h除之前安裝的mariadb,具體安裝方法及遇到問題解決方法,大家參考下本文
    2018-05-05
  • 深入理解sqlserver中的字符編碼、排序規(guī)則、nvarchar和varchar

    深入理解sqlserver中的字符編碼、排序規(guī)則、nvarchar和varchar

    本文主要介紹了深入理解sqlserver中的字符編碼、排序規(guī)則、nvarchar和varchar,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • MySQL DML語句整理匯總

    MySQL DML語句整理匯總

    這篇文章主要介紹了MySQL DML語句整理匯總,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • MySQL8.0的WITH查詢詳情

    MySQL8.0的WITH查詢詳情

    這篇文章主要介紹了MySQL的WITH查詢詳情,需要的下伙伴可以參考下文
    2021-08-08

最新評論

博白县| 西乌珠穆沁旗| 延庆县| 江油市| 永安市| 冕宁县| 晋宁县| 凤庆县| 会东县| 射洪县| 灌阳县| 佛坪县| 华宁县| 韶关市| 资阳市| 奉新县| 抚远县| 石狮市| 喀什市| 临潭县| 敦煌市| 太白县| 鄯善县| 若尔盖县| 恩施市| 新巴尔虎左旗| 玉龙| 奎屯市| 巴东县| 台湾省| 东乡| 临邑县| 杭锦旗| 巴楚县| 辽源市| 资兴市| 金寨县| 炎陵县| 万荣县| 乐业县| 兴义市|