- SQL语句尽可能简单
- 事务简单,执行时间不能太长
- 不使用触发器、函数、存储过程
- 分库分表
- 不使用数学运算
- 不使用select *
- 将 OR 改成 IN
- in里面的数字个数控制在1000以内
- 使用union all 替代union
- 不使用大表的join
- 使用group by分组,自动排序
- 不要一次更新太多数据
- 注意SQL分析工具explain查看执行计划,分析一条sql语句用explain+sql
- SQL关键字全部是大写,每个词只允许有一个空格
- SQL语句不可以出现隐式转换,(当join两个表时,两个同名字段的字符类型不同,容器出现隐式转换)
- in条件里数据量要少,学会使用exist替代in
- 尽量不用not in
- 禁止使用前缀是%的like
- 分页使用limit
- 使用预编译语句
- 禁止使用order by rand()
- 禁止单条SQL语句同时更新多个表
- 避免或减少临时表
- where子句中的数据扫描别跨越表的30%,
- where子句中同一个表的不同字段组合建议小于等于5组,否则考虑业务逻辑或分表
- 不使用is null或is not null
- 值域比较多的表字段放在前面
- 表字段组合中出现比较多的表字段放在前面
- 表字段不能有表达式或函数
- 用where替换having
- 对同一表的order by和group by操作分别小于3组
- 使用主键进行update和delete
- 减少或避免排序,group by中不需要排序,增加order by null
- 语句中不使用rand()和now()
- insert语句使用batch提交的个数不超过500
- 使用合理的SQL语句减少与数据库的交互次数
- 减少使用视图
- update和delete语句中不使用limit
- InnoDB表避免使用count(*)
- Oracle和MySQL的一些差异
- 自动增长的数据类型处理:MySQL有auto_increment,Oracle没有
- 单引号的处理:MySQL可以用单双,Oracle只能用单
- 翻页的SQL语句的处理:MySQL用limit,Oracle用rownum
- 日期字段的处理:MySQL有date、datetime、timestamp、time、year;Oracle只有Date
- MySQL找到离当前时间7天用date_field_name>subdate((now(),interval 7 Day))
- Oracle:date_field_name>sysdate -7 空字符的处理:MySQL的非空字段也有空的内容,Oracle不能