MySQL索引進(jìn)階

組合索引

常見誤區(qū):

表上建多個(gè)索引,就是組合索引(不是);
組合索引創(chuàng)建時(shí)應(yīng)該把整數(shù)字段放前面(要根據(jù)查詢情況而定);
組合索引建好后,只要使用包含的字段,就會(huì)走索引(要看使用順序);

注意事項(xiàng):

在where條件中,組合必須是從前往后順序?qū)懀ㄋ饕樞颍┎艜?huì)生效,條件順序可以前后顛倒(MySQL有優(yōu)化);
組合索引在設(shè)計(jì)聯(lián)合、分組、排序等復(fù)雜SQL時(shí)會(huì)變得很復(fù)雜,所以需要先explain確認(rèn)再寫SQL;
在查詢中只要構(gòu)造上能使用索引的話,查詢速度比不使用索引要快的多(哪怕有些無效條件),所以大表的查詢要養(yǎng)成先看表結(jié)構(gòu)的習(xí)慣;

多表關(guān)聯(lián)

常見誤區(qū):

關(guān)聯(lián)時(shí)小表在前面,大表在后面查詢會(huì)更快(MySQL有優(yōu)化);
關(guān)聯(lián)的字段2個(gè)表都要有索引(MySQL有優(yōu)化,可以使用Explain確認(rèn));
只要有索引的字段關(guān)聯(lián)就會(huì)快(還要看數(shù)據(jù),看數(shù)據(jù),看數(shù)據(jù));
注意事項(xiàng):
多表關(guān)聯(lián)時(shí),關(guān)聯(lián)字段必須要確認(rèn)是否可用索引;
有些優(yōu)化細(xì)節(jié),未必會(huì)適用于所有版本或者所有數(shù)據(jù),所以編寫復(fù)雜SQL時(shí)還是要使用explain確認(rèn)是走索引,尤其是在線上數(shù)據(jù)環(huán)境下;
針對(duì)不確定的數(shù)據(jù),很有必要確認(rèn)數(shù)據(jù),查看是否有重復(fù)數(shù)據(jù);
針對(duì)無故執(zhí)行太慢的查詢,有必要確認(rèn)一下關(guān)聯(lián)字段的數(shù)據(jù),有時(shí)候沒準(zhǔn)就是大量重復(fù)數(shù)據(jù)造成的;

笛卡爾積

笛卡爾積也叫笛卡爾乘積,是指在數(shù)學(xué)中兩個(gè)集合X和Y的笛卡尓積(Cartesian product),又稱直積,表示為X × Y,第一個(gè)對(duì)象是X的成員而第二個(gè)對(duì)象是Y的所有可能有序?qū)Φ钠渲幸粋€(gè)成員。
笛卡爾積可以理解為2個(gè)數(shù)據(jù)集合的遍歷結(jié)合,如果A表和B表進(jìn)行關(guān)聯(lián),但沒有設(shè)定任何關(guān)聯(lián)條件,即可產(chǎn)生一個(gè)笛卡爾積,例如select * from a, b
但實(shí)際情況中很多人關(guān)聯(lián)時(shí)不注意關(guān)聯(lián)字段的數(shù)據(jù)唯一性,也是很容易產(chǎn)生笛卡爾積,所以SQL關(guān)聯(lián)時(shí),一定要注意要對(duì)關(guān)聯(lián)字段的數(shù)據(jù)性質(zhì)和數(shù)據(jù)分布情況有一個(gè)很準(zhǔn)確的理解;
并非所有的笛卡爾積都是不好的,有時(shí)候也可以利用笛卡爾積完成一些很有用的事情;

常見索引不生效的情況

組合索引的使用順序應(yīng)該是從左到右的,中間不能空缺,例如:索引字段依次為a, b, c 那么條件中a要排在b、c的前面否則是不生效的,出現(xiàn)a,c則生效的部分只有字段a;
like中%位于字符串前面,如:like ‘%xxx’;
對(duì)符號(hào)左側(cè)進(jìn)行運(yùn)算或函數(shù),如:where a+1>7;
使用not in 和<>操作,如:where a<>4,如果確實(shí)需要,可以使用a>4 or a<4代替,
如果有過多的or,也可能會(huì)導(dǎo)致索引不生效,例如where a=10 or a=20 or a=30 or a =40,此時(shí)可以用in或者union all代替;
有關(guān)null值的查詢,如:where a is null,所以應(yīng)盡量給自動(dòng)設(shè)置默認(rèn)值;
數(shù)據(jù)類型不一致,如,a字段類型為int,但查詢時(shí)寫成where a = ‘123’;
索引類型是Hash索引,但查詢中使用了范圍查找;
MySQL估計(jì)使用全表掃描比使用索引更快,多數(shù)是數(shù)據(jù)分布等原因;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容