MySQL在日常開發過程中的注意事項

MysqlInnoDB引擎在查詢優化方面非常弱,因此需要一些注意事項:

1. where條件中的字段類型和數據庫中的字段類型不一致時,不會使用索引。例如Flag='6'Flag=6FlagVarchar時前者使用索引,後者不使用索引。這就要求我們將傳給QueryBuilder的參數的類型轉換得和數據庫中的一致,非參數化where條件中的Varchar類型則要注意加單引號。

2. like會使用索引,例如ClassInnerCode like '0000001%',但左like不會,例如ClassInnerCode like '%000001'不使用索引。

3. 不等於不會使用索引,例如Flag<>'5'不使用索引。

4. Mysqllimit分頁有缺陷,越到後面的頁越慢。

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,則性能會極差,需要立即調整。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章