組合索引
常見誤區(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)境下雳旅;
針對不確定的數(shù)據(jù)跟磨,很有必要確認(rèn)數(shù)據(jù),查看是否有重復(fù)數(shù)據(jù)攒盈;
針對無故執(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è)對象是X的成員而第二個(gè)對象是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í)纪铺,一定要注意要對關(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’蔬捷;
對符號(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ù)分布等原因柱蟀;