mysql索引失效的幾種情況分析
1、最佳左前綴原則——如果索引了多列,要遵守最左前綴原則。指的是查詢(xún)要從索引的最左前列開(kāi)始并且不跳過(guò)索引中的列。
前提條件:表中已添加復(fù)合索引(username,password,age)
分析:該查詢(xún)?nèi)鄙賣(mài)sername,查詢(xún)條件復(fù)合索引最左側(cè)username缺少,違反了最佳左前綴原則,導(dǎo)致索引失效,變?yōu)锳LL,全表掃描
分析:查詢(xún)條件缺少u(mài)sername,password,查詢(xún)條件復(fù)合索引最左側(cè)username,password缺少,違反了最佳左前綴原則,導(dǎo)致索引失效,變?yōu)锳LL,全表掃描
分析:該查詢(xún)只有一個(gè)username條件,根據(jù)最佳左前綴原則索引能夠被使用到,但是是部分使用
2、不在索引列上做任何操作(計(jì)算,函數(shù),(自動(dòng)或者手動(dòng))類(lèi)型裝換),會(huì)導(dǎo)致索引失效而導(dǎo)致全表掃描
分析:第一個(gè)圖索引列不使用函數(shù),遵循左前綴原則,能夠使用索引。第二張圖索引列上使用了函數(shù),即使遵循左前綴原則,索引還是失效
3、存儲(chǔ)引擎不能使用索引中范圍條件右邊的列,范圍之后索引失效。(< ,> between and)
分析:圖一索引全部使用到。圖二索引使用到username和age,但是username是使用索引檢索,而age著重索引排序,這時(shí)age為范圍查找,password索引將失效
4、mysql使用不等于(!= 或者<>)的時(shí)候,無(wú)法使用索引,會(huì)導(dǎo)致索引失效
5、mysql中使用is not null 或者 is null會(huì)導(dǎo)致無(wú)法使用索引
分析:對(duì)username列做了普通索引,查詢(xún)帶is not null,結(jié)果索引不生效
6、mysql中l(wèi)ike查詢(xún)是以%開(kāi)頭,索引會(huì)失效變成全表掃描,覆蓋索引。
分析:對(duì)username列做了普通索引,以%開(kāi)頭進(jìn)行查詢(xún),結(jié)果索引失效被覆蓋
7、mysql中,字符串不加單引號(hào)索引會(huì)失效。正確寫(xiě)法:select * from t_user where username = 'lujin';
8、mysql中,如果條件中有or,即使其中有條件帶索引也不會(huì)使用(這也是為什么盡量少用or的原因)。要想使用or,又想讓索引生效,只能將or條件中的每個(gè)列都加上索引
9、如果mysql使用全表掃描要比使用索引快,則不會(huì)使用到索引
總結(jié)
到此這篇關(guān)于mysql索引失效情況分析的文章就介紹到這了,更多相關(guān)mysql索引失效內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SQL中distinct 和 row_number() over() 的區(qū)別及用法
這篇文章主要介紹了SQL中distinct 和 row_number() over() 的區(qū)別及用法的相關(guān)資料,需要的朋友可以參考下2017-03-03MySQL學(xué)習(xí)第二天 安裝和配置mysql winx64
MySQL學(xué)習(xí)第二天,主要為大家詳細(xì)介紹了在Windows 64位操作系統(tǒng)下安裝和配置MySQL的具體步驟,整理一份mysql winx64安裝配置方法教程,感興趣的小伙伴們可以參考一下2016-05-05