口訣
模型數(shù)或運(yùn)算快
初始化數(shù)據(jù)庫(kù)
這里我們以MySQL自帶的world數(shù)據(jù)庫(kù)中的country表為例。
索引失效七大場(chǎng)景
模(模糊查詢)
向name列添加索引
create index index_name on country(name);
查看country表索引
show index from country;
- 測(cè)試like完全匹配
explain select count(1) from country where name like '%Aruba%'
可以看到type級(jí)別是index。索引失效。
在 MySQL 中,使用 EXPLAIN 語(yǔ)句可以查看查詢語(yǔ)句的執(zhí)行計(jì)劃,了解 MySQL 如何執(zhí)行查詢。其中,EXPLAIN
語(yǔ)句的結(jié)果集中的 type 字段用于表示 MySQL 在執(zhí)行查詢時(shí)所使用的訪問(wèn)類型。
type 字段可能的取值包括:
system:表示只有一行數(shù)據(jù)的表,通常是一些系統(tǒng)表; const:表示只有一行數(shù)據(jù)的表,通常是通過(guò)在查詢中指定主鍵或唯一索引來(lái)檢索數(shù)據(jù);
eq_ref:表示使用了連接索引,且索引的所有部分都被使用,一般出現(xiàn)在連接查詢中;
ref:表示使用了非唯一性索引,返回匹配某個(gè)單獨(dú)值的所有行;
fulltext:表示使用全文索引進(jìn)行搜索;
ref_or_null:表示使用非唯一性索引,但可能存在一個(gè)或多個(gè) NULL 值;
index_merge:表示使用了多個(gè)索引進(jìn)行查詢,并將結(jié)果進(jìn)行合并;
unique_subquery:表示使用了子查詢,并且該子查詢使用了唯一性索引;
index_subquery:表示使用了子查詢,并且該子查詢使用了非唯一性索引;
range:表示使用了索引進(jìn)行范圍查詢;
index:表示全表掃描,并且按索引順序掃描;
all:表示全表掃描。
需要注意的是,type字段的取值順序是從最好到最差的查詢類型順序。當(dāng) type 字段的取值是 system、const、eq_ref 時(shí),性能最好;當(dāng) type字段的取值是 all 時(shí),性能最差。
通過(guò)查看 type字段的取值,可以評(píng)估查詢的性能并優(yōu)化查詢。通常來(lái)說(shuō),使用索引查詢會(huì)比全表掃描查詢更快速、更高效。因此,盡可能地使用索引來(lái)優(yōu)化查詢是一個(gè)很好的選擇。
- 測(cè)試like左匹配
explain select count(1) from country where Name like '%Aruba'
type級(jí)別為index,索引失效。
- 測(cè)試like右匹配
explain select count(1) from country where Name like 'Aruba%';
type級(jí)別為range,索引命中!
所以注意模糊查詢右匹配可以命中?。。?/font>
型(數(shù)據(jù)類型)
如果數(shù)據(jù)類型不匹配那么索引就會(huì)失效。
如下面的sql
explain select count(1) from country where name=1
數(shù)(函數(shù))
對(duì)索引的字段使用內(nèi)部函數(shù),索引也會(huì)失效。
對(duì)population字段創(chuàng)建索引
create index index_population on country(population);
這里對(duì)population字段使用POW函數(shù)
explain select pow(Population,2) from country;
索引失效。
或(OR)
where語(yǔ)句中使用or來(lái)連接的字段,如果一個(gè)有索引一個(gè)沒(méi)索引,那么存儲(chǔ)引擎將放棄索引而全表掃描
explain select count(1) from country where name like 'Aruba%' or SurfaceArea=193;
級(jí)別為ALL,全表掃描,索引失效。
運(yùn)(運(yùn)算)
對(duì)索引的列進(jìn)行算術(shù)運(yùn)算將使索引失效。
explain select count(1) from country where Population+1>100000;
最(最左原則)
嘴和索引,查詢的條件列不是聯(lián)合索引的第一個(gè)列,索引失效。
給Continent,Region,IndepYear字段創(chuàng)建聯(lián)合索引
create index index_union on country(Continent,Region,IndepYear);
- where條件中包含聯(lián)合索引最左字段
explain select count(1) from country where Region='Caribbean' and Continent='North America';
級(jí)別為ref,索引有效。
- where條件中不包含聯(lián)合索引最左字段
explain select count(1) from country where IndepYear IS NULL and Continent='North America';
索引失效。
快(查詢數(shù)據(jù)量大)
當(dāng)查詢數(shù)量超過(guò)表的一部分,索引就會(huì)失效。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-421163.html
explain select count(1) from country where Population>=0;
Population>=0全部數(shù)據(jù)都會(huì)查出,type是index,索引失效。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-421163.html
到了這里,關(guān)于MySQL索引失效的七大場(chǎng)景的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!