組合索引
常見誤區:
表上建多個索引,就是組合索引(不是);
組合索引創建時應該把整數字段放前面(要根據查詢情況而定);
組合索引建好后,只要使用包含的字段,就會走索引(要看使用順序);
注意事項:
在where條件中,組合必須是從前往后順序寫(索引順序)才會生效,條件順序可以前后顛倒(MySQL有優化);
組合索引在設計聯合、分組、排序等復雜SQL時會變得很復雜,所以需要先explain確認再寫SQL;
在查詢中只要構造上能使用索引的話,查詢速度比不使用索引要快的多(哪怕有些無效條件),所以大表的查詢要養成先看表結構的習慣;
多表關聯
常見誤區:
關聯時小表在前面,大表在后面查詢會更快(MySQL有優化);
關聯的字段2個表都要有索引(MySQL有優化,可以使用Explain確認);
只要有索引的字段關聯就會快(還要看數據,看數據,看數據);
注意事項:
多表關聯時,關聯字段必須要確認是否可用索引;
有些優化細節,未必會適用于所有版本或者所有數據,所以編寫復雜SQL時還是要使用explain確認是走索引,尤其是在線上數據環境下;
針對不確定的數據,很有必要確認數據,查看是否有重復數據;
針對無故執行太慢的查詢,有必要確認一下關聯字段的數據,有時候沒準就是大量重復數據造成的;
笛卡爾積
笛卡爾積也叫笛卡爾乘積,是指在數學中兩個集合X和Y的笛卡尓積(Cartesian product),又稱直積,表示為X × Y,第一個對象是X的成員而第二個對象是Y的所有可能有序對的其中一個成員。
笛卡爾積可以理解為2個數據集合的遍歷結合,如果A表和B表進行關聯,但沒有設定任何關聯條件,即可產生一個笛卡爾積,例如select * from a, b
但實際情況中很多人關聯時不注意關聯字段的數據唯一性,也是很容易產生笛卡爾積,所以SQL關聯時,一定要注意要對關聯字段的數據性質和數據分布情況有一個很準確的理解;
并非所有的笛卡爾積都是不好的,有時候也可以利用笛卡爾積完成一些很有用的事情;
常見索引不生效的情況
組合索引的使用順序應該是從左到右的,中間不能空缺,例如:索引字段依次為a, b, c 那么條件中a要排在b、c的前面否則是不生效的,出現a,c則生效的部分只有字段a;
like中%位于字符串前面,如:like ‘%xxx’;
對符號左側進行運算或函數,如:where a+1>7;
使用not in 和<>操作,如:where a<>4,如果確實需要,可以使用a>4 or a<4代替,
如果有過多的or,也可能會導致索引不生效,例如where a=10 or a=20 or a=30 or a =40,此時可以用in或者union all代替;
有關null值的查詢,如:where a is null,所以應盡量給自動設置默認值;
數據類型不一致,如,a字段類型為int,但查詢時寫成where a = ‘123’;
索引類型是Hash索引,但查詢中使用了范圍查找;
MySQL估計使用全表掃描比使用索引更快,多數是數據分布等原因;