我們一(yī)直在路(lù)上(shàng),隻為ε♥(wèi)更優質的(de)服務
SMART SERVICE
TIME: 2019-01-25
1. 【強制(zhì)】業(yè)務上(shàng)具有(yǒu♠★δ)唯一(yī)特性的(de)字段,即使是(shì)多(duō)個(♦♣gè)字段的(de)組合,也(yě)必須建成唯一(Ω€✘yī)索引。
說(shuō)明(míng):不(bù)要(yàoλ♦φ₽)以為(wèi)唯一(yī)索引影(yǐng)響₹↑了(le)insert速度,這(zhè)個&β©(gè)速度損耗可(kě)以忽略,但(dàn)提高(gāo)查®₽$找速度是(shì)明(míng)顯的(de);另外(wài)∏≈,即使在應用(yòng)層做(zuò)了(le)非常完善的(de)校(xΩ€&iào)驗控制(zhì),隻要(yào)沒有(yǒu✘ )唯一(yī)索引,根據墨菲定律,必然有(yǒu)髒數(shù)₹φ據産生(shēng)。
2. 【強制(zhì)】超過三個(gè)₽₽表禁止join。需要(yào)join的(de)字段,數(sh↓'ù)據類型必須絕對(duì)一(yī)緻;多(d✔↔uō)表關聯查詢時(shí),保證被關聯的(de)字段需要(yào)有(y★∑♥>ǒu)索引。
說(shuō)明(míng):即使雙表join也(y€∞ě)要(yào)注意表索引、SQL性能(néng)。
3. 【強制(zhì)】在varchar≥ 字段上(shàng)建立索引時(shí),必須指定索引↔αδ長(cháng)度,沒必要(yào)對(duì)全字段建立₩★索引,根據實際文(wén)本區(qū)分($φεfēn)度決定索引長(cháng)度即可(kě)。
說(shuō)明(míng):索引的(de)長(cháng±£♦)度與區(qū)分(fēn)度是(shì)一(yī)對(duì)矛< ≥&盾體(tǐ),一(yī)般對(duì)字符串類型數(shù)據,長≤₩÷(cháng)度為(wèi)20的(de)索引,區(qū)分(fēnβ✘∏)度會(huì)高(gāo)達90%以上(sh₽↔≤↔àng),可(kě)以使用(yòng)count(distinct lefΩ÷₹t(列名, 索引長(cháng)度))/c±↕↑•ount(*)的(de)區(qū)分(fēn)度↔↓≈ 來(lái)确定。
4. 【強制(zhì)】頁面搜索嚴禁左模糊或者全模糊,₹α ∏如(rú)果需要(yào)請(qǐng)走搜索引擎來(₹&lái)解決。
說(shuō)明(míng):索引文(wén)件(jià↕÷n)具有(yǒu)B-Tree的(de)最左前綴匹配特性,如(rú)果左邊的(↔¥"↑de)值未确定,那(nà)麽無法使用(yòng)此索引。
5. 【推薦】如(rú)果有(yǒu)order by的(dασe)場(chǎng)景,請(qǐng)注意利用(yòng)索引& 的(de)有(yǒu)序性。order by 最後的(de)字段是(shì)↕♣組合索引的(de)一(yī)部分(fēn),并且放(fàng)•™在索引組合順序的(de)最後,避免出現(xiàn)€↕file_sort的(de)情況,影(yǐng)響查詢性能(néng)。
正例:where a=? and b=? o→≠rder by c; 索引:a_b_c 反例:索引中有(yǒu✔♥¶¶)範圍查找,那(nà)麽索引有(yǒu)序性無法利用(yòng),如(r₽♦₩ú):WHERE a>10 ORD>•ER BY b; 索引a_b無法排序。
6. 【推薦】利用(yòng)覆蓋索引來(lái)進行(xíng"₽✔β)查詢操作(zuò),避免回表。
說(shuō)明(míng):如(rú)果一(yī)本書(s♣hū)需要(yào)知(zhī)道(dào)第11章(zhāng)是(shì♥÷ )什(shén)麽标題,會(huì)翻開(€♥kāi)第11章(zhāng)對(duì)應的(de)那(n§≤•à)一(yī)頁嗎(ma)?目錄浏覽一(yī)下(xià)就(jiù)好(hǎγ o),這(zhè)個(gè)目錄就(ji≤★ù)是(shì)起到(dào)覆蓋索引的(de)作(zuò∞'Ω)用(yòng)。
正例:能(néng)夠建立索引的(de)種類分(f' ≤ēn)為(wèi)主鍵索引、唯一(yī)索引、普通(tōng)索引三種,$≤•♠而覆蓋索引隻是(shì)一(yī)種查詢的(de)一(yī)種φ©§ 效果,用(yòng)explain的(de)結果,extra列會(huì)出αβ₽λ現(xiàn):using index。
7. 【推薦】利用(yòng)延遲關聯或者子(zǐ)查詢優化(huà)超多(d±↑uō)分(fēn)頁場(chǎng)景。
說(shuō)明(míng):MySQL并不(bù)是(shì)跳(tiào)&↔過offset行(xíng),而是(shì₽$↑)取offset+N行(xíng),然後返回放(fàng)棄前of↕↔fset行(xíng),返回N行(xíng),那(nà)當of±∞fset特别大(dà)的(de)時(shí)候,效率就(jiù)非¥↑¶常的(de)低(dī)下(xià),要(yàoφ↓)麽控制(zhì)返回的(de)總頁數(shù),≤₩要(yào)麽對(duì)超過特定阈值的(de)∑≤♠★頁數(shù)進行(xíng)SQL改寫。
正例:先快(kuài)速定位需要(yào)獲取的(de)id段,然後再β☆關聯: SELECT a.* FROM 表1 a<δ , (select id from 表1 where 條件(÷εσjiàn) LIMIT 100000,20 )<φ≈& b where a.id=b.id
8. 【推薦】 SQL性能(néng)優化(huà)的(de)目标:至少(>®shǎo)要(yào)達到(dào) range ✔®級别,要(yào)求是(shì)ref級≤©✘别,如(rú)果可(kě)以是(shì)const¥¥♠s最好(hǎo)。 說(shuō)明(míng):
1)consts 單表中最多(duō)隻有(yǒ±γu)一(yī)個(gè)匹配行(xíng)(主鍵或者唯一(yī)索引→₽),在優化(huà)階段即可(kě)讀(dú)取到(dào)數(s≠©₩×hù)據。 2)ref 指的(de)是(shì)使用(yòn∑✔¶☆g)普通(tōng)的(de)索引(normal i↓•ndex)。
3)range 對(duì)索引進行(xíng)範圍檢索。 反例:explai✘∑≥n表的(de)結果,type=index,索引物(w★γδ§ù)理(lǐ)文(wén)件(jiàn)全掃描,速度非常$"↔慢(màn),這(zhè)個(gè)index級别比較range還 ∞(hái)低(dī),與全表掃描是(shì)小(x↓¥iǎo)巫見(jiàn)大(dà)巫。
9. 【推薦】建組合索引的(de)時(sh•&×í)候,區(qū)分(fēn)度最高(gā ∏γo)的(de)在最左邊。
說(shuō)明(míng):存在非等号和(hé)等号混合時(shí™≥π•),在建索引時(shí),請(qǐng)把等号條件(jiàn)的(₩§∑de)列前置。如(rú):where c&g↓♠t;? and d=? 那(nà)麽即使c的(de)區(✘✔βqū)分(fēn)度更高(gāo),也(yě)必須把d放(f÷Ωàng)在索引的(de)最前列,即索引idx_d_c。
正例:如(rú)果where a=? and b=? ,如(rú)果a列的↔α(de)幾乎接近(jìn)于唯一(yī)值,那∑₹☆σ(nà)麽隻需要(yào)單建idx_a索γ'÷♣引即可(kě)。
10. 【推薦】防止因字段類型不(bù)同造成的(★'γλde)隐式轉換,導緻索引失效。
11. 【參考】創建索引時(shí)避免↕✔♥有(yǒu)如(rú)下(xià)極端誤解:
1)甯濫勿缺。認為(wèi)一(yī)個(gè)查詢就(jiù)需要(y↔$ào)建一(yī)個(gè)索引。
2)甯缺勿濫。認為(wèi)索引會(hu©&γì)消耗空(kōng)間(jiān)、嚴重拖慢(màΩα✘πn)更新和(hé)新增速度。
3)抵制(zhì)惟一(yī)索引。認為(wèi)業(yè)務的(deδ∞♠)惟一(yī)性一(yī)律需要(yào)在應用(yòn≈≤g)層通(tōng)過“先查後插”方式解決¶↕₩。