1. where條件中的字段類型和數據庫中的字段類型不一致時,不會使用索引。例如Flag='6'和Flag=6在Flag爲Varchar時前者使用索引,後者不使用索引。這就要求我們將傳給QueryBuilder的參數的類型轉換得和數據庫中的一致,非參數化where條件中的Varchar類型則要注意加單引號。
2. 右like會使用索引,例如ClassInnerCode like '0000001%',但左like不會,例如ClassInnerCode like '%000001'不使用索引。
3. 不等於不會使用索引,例如Flag<>'5'不使用索引。
4. Mysql的limit分頁有缺陷,越到後面的頁越慢。
5. 在沒有Order by子句時,Flag in ('6','8')和Flag='6' or Flag='8'會使用索引,但有Order by時實際上索引不生效。
6. 複合索引(A,B,C)相當於單獨索引(A)+複合索引(A,B)+複合索引(A,B,C),即在查詢時Mysql會使用複合索引的前面部分的字段。便如索引(Flag,ClassType,ClassInnerCode),會在條件不Flag='6'時起作用,也會在Flag='6' and ClassType='1'時起作用,在Flag='6' and ClassType='1' and ClassInnerCode like '000001'時也起作用。但不會在Flag='6' and ClassInnerCode like '000001'時起作用。這個意味着如果有兩個索引(Flag)和(Flag,ClassType),則(Flag)是多餘的。
7. 可以在sql之前加explain來得到SQL的執行計劃,例如explan select * from zcarticle。執行計劃會列出是否使用索引,使用什麼樣的索引。特別要注意的是Extra段,如果出現了FileSort,則性能會極差,需要立即調整。