1.1. 批量插入數據數據庫
1.2. 避免出現select *網絡
1.3. 避免使用insert…select…語句併發
由於 oracle 並不存在相似的問題,因此在 oracle 的應用中 insert...select...操做很是的常見。oracle
優化建議
1.從可移植性上考慮,建議將單條語句分離爲select與insert兩部分,雖然至關於增長了網絡傳輸次數,但再也不會出現鎖阻塞狀況。
2.使用MySQL語句語法,可使用select...into outfile 和 load data infile 的組合來實現,這樣也不會對錶進行鎖定。這種方法會使用外部文件,不事宜移植到其餘平臺。函數
1.4. UPDATE,DELETE語句須要有對應索引性能
優化建議
使用innodb存儲引擎時,針對有大量併發修改(insert,update,delete)的表,評估SQL語句並創建相應索引,保證語句不會走全表掃描。優化
1.5. 利用索引優化order by操做索引
1.6. 利用索引優化or條件io
優化建議
創建符合索引,保證對經過OR判斷的列都同一條索引上。innodb
1.7. 索引列上使用函數致使不使用索引
1.8. like子句上使用前綴%致使不使用索引
優化建議
在應用程序中,考慮增長對這些大表查詢輸入條件的限制,從性能角度考慮,儘可能避免出現以%爲前綴的數據查詢。防止應用程序提交大量會引發大表全表掃描的查詢。
1.9. 語句僅包含複合索引非前導列致使不使用索引
1.10. 隱式類型轉換形成不使用索引
1.11. 對索引字段進行運算致使不使用索引
1.12. 對索引字段進行是否NULL值判斷致使不使用索引
1.13. 對索引字段使用不等於符號致使不使用索引
使用索引列做爲條件進行查詢時,須要避免使用<>或者!=等判斷條件。
1.14. 使用join子句來優化子查詢
1.15. 優化union語句
除非確實要消除重複的行,不然建議使用union all。緣由在於若是沒有all這個關鍵詞,MySQL會給臨時表加上distinct選項,這會致使對整個臨時表的數據作惟一性校驗,這樣作的消耗至關高。
1.16. 使用合理的分頁方式以提升分頁效率
1.17. 避免重複查詢更新的數據
問題案例
UPDATE T1 SET TIME=NOW() WHERE COL1=1;
SELECT TIME FROM T1 WHERE ID =1;
問題分析
上述語句爲了獲取更新,至關於對同一張表執行了兩次查詢,當基表數據量大的時候,經過這種方式獲取更新的數據效率上不是最好的。針對業務中常常出現的更新行同時又但願得到改行信息的需求,MySQL並不支持PostgreSQL那樣的UPDATE RETURNING語法,在MySQL中能夠經過變量實現。
優化建議
UPDATE T1 SET TIME=NOW () WHERE COL1=1 AND @NOW: = NOW ();
SELECT @NOW;
先後兩者都須要兩次網絡來回,但使用變量避免了再次訪問數據表,特別是當t1表數據量較大時,後者比前者快不少。
1.18. 避免出現不肯定結果的函數
1.19. 錯誤使用 order by rand()
優化建議:隨機值由應用端獲取,在數據庫中只執行實際值。