(1)使用prepared statement,可以提升性能并避免SQL注入。

(2)使用IN代替OR。SQL语句中IN包含的值不应过多,应少于1000个。

(3)禁止隐式转换。数值类型禁止加引号;字符串类型必须加引号。

(4)避免使用JOIN和子查询。必要时推荐用JOIN代替子查询。

(5)禁止在MySQL中进行数学运算和函数运算。

(6)减少与数据库交互次数,尽量采用批量SQL语句。

(7)拆分复杂SQL为多个小SQL,避免大事务。

(8)获取大量数据时,建议分批次获取数据,每次获取数据少于2000条,结果集应小于1M。

(9)使用UNION ALL代替UNION。

(10)统计行数使用COUNT(*)。

(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评估通过。