1.索引列不要使用函數(shù)和運(yùn)算
2. 盡量避免使用 != 或 not in或 <> 等否定操作符
3.當(dāng)查詢條件為多個(gè)的時(shí)候,可以采用復(fù)合索引
4.范圍查詢對(duì)多列查詢的影響
? ?查詢中的某個(gè)列有范圍查詢奸汇,則其右邊所有列都無(wú)法使用索引優(yōu)化查找即寒。
舉個(gè)例子慷吊,假設(shè)有一個(gè)場(chǎng)景需要查詢本周發(fā)布的資訊文章爵川,其中的條件是必須是啟用狀態(tài)策添,且發(fā)布時(shí)間在這周內(nèi)吗铐。那么东亦,SQL 語(yǔ)句可以寫成:
select*fromnewswherepublish_time >='2017-01-02'andpublish_time <='2017-01-08'andenable=1
這種情況下,因?yàn)榉秶樵儗?duì)多列查詢的影響唬渗,將導(dǎo)致 news_publish_idx(publish_time, enable) 索引中 publish_time 右邊所有列都無(wú)法使用索引優(yōu)化查找典阵。換句話說(shuō),news_publish_idx(publish_time, enable) 索引等價(jià)于 news_publish_idx(publish_time) 镊逝。
對(duì)于這種情況壮啊,我的建議:對(duì)于范圍查詢,務(wù)必要注意它帶來(lái)的副作用撑蒜,并且盡量少用范圍查詢歹啼,可以通過(guò)曲線救國(guó)的方式滿足業(yè)務(wù)場(chǎng)景。
5.遵循最左匹配原則
? ?復(fù)合索引遵守“最左前綴”原則座菠,即在查詢條件中使用了復(fù)合索引的第一個(gè)字段狸眼,索引才會(huì)被使用。因此浴滴,在復(fù)合索引中索引列的順序至關(guān)重要拓萌。如果不是按照索引的最左列開始查找,則無(wú)法使用索引巡莹。
6.索引列不會(huì)包含NULL值
7.盡量避免使用 or 來(lái)連接條件
8.隱式轉(zhuǎn)換的影響
? ?當(dāng)查詢條件左右兩側(cè)類型不匹配的時(shí)候會(huì)發(fā)生隱式轉(zhuǎn)換司志,隱式轉(zhuǎn)換帶來(lái)的影響就是可能導(dǎo)致索引失效而進(jìn)行全表掃描甜紫。下面的案例中降宅,date_str 是字符串骂远,然而匹配的是整數(shù)類型,從而發(fā)生隱式轉(zhuǎn)換腰根。
select*fromnewswheredate_str =201701
9.like 語(yǔ)句的索引失效問(wèn)題
like 的方式進(jìn)行查詢激才,在 like "value%" 可以使用索引,但是對(duì)于 like "%value%" 這樣的方式额嘿,執(zhí)行全表查詢瘸恼,這在數(shù)據(jù)量小的表,不存在性能問(wèn)題册养,但是對(duì)于海量數(shù)據(jù)东帅,全表掃描是非常可怕的事情球拦。所以靠闭,根據(jù)業(yè)務(wù)需求,考慮使用