(1)使用prepared statement,能夠提高性能並避免SQL注入。數據庫
(2)使用IN代替OR。SQL語句中IN包含的值不該過多,應少於1000個。ide
(3)禁止隱式轉換。數值類型禁止加引號;字符串類型必須加引號。函數
(4)避免使用JOIN和子查詢。必要時推薦用JOIN代替子查詢。性能
(5)禁止在MySQL中進行數學運算和函數運算。索引
(6)減小與數據庫交互次數,儘可能採用批量SQL語句。事務
(7)拆分複雜SQL爲多個小SQL,避免大事務。字符串
(8)獲取大量數據時,建議分批次獲取數據,每次獲取數據少於2000條,結果集應小於1M。數學
(9)使用UNION ALL代替UNION。it
(10)統計行數使用COUNT(*)。class
(11)SELECT只獲取必要的字段,禁止使用SELECT *。
(12)SQL中避免出現now()、rand()、sysdate()、current_user()等不肯定結果的函數。
13)INSERT語句必須指定字段列表,禁止使用 INSERT INTO TABLE()。
(14)禁止單條SQL語句同時更新多個表。
(15)禁止使用存儲過程、觸發器、視圖、自定義函數等。
(16)建議使用合理的分頁方式以提升分頁效率。
(17)禁止在從庫上執行後臺管理和統計類功能的QUERY,必要時申請統計類從庫。
(18)程序應有捕獲SQL異常的處理機制,必要時經過rollback顯式回滾。
(19)重要SQL必須被索引:update、delete的where條件列、order by、group by、distinct字段、多表join字段。
(20)禁止使用%前導查詢,例如:like 「%abc」,沒法利用到索引。
(21)禁止使用負向查詢,例如 not in、!=、not like。
(22)使用EXPLAIN判斷SQL語句是否合理使用索引,儘可能避免extra列出現:Using File Sort、Using Temporary。
(23)禁止使用order by rand()。
(24)禁止使用REPLACE INTO和INSERT ON DUPLICATE KEY UPDATE的語句類型,除非業務場景特殊且DBA評估經過。