- 首要原则:语句尽量简单,不在数据库做复杂运算,不用存储过程、函数。
- select,insert一定要带上字段名,尽量少用select *。
- 优化LIMIT分页:不要用LIMIT start, offset。
- 禁用select for update、insert……select from、select *(必须明确给出需要字段)、insert TB values……(必须明确给出字段)、order by rand()语法。它会扩大意向锁范围,较大程度影响数据库的并发事务效率。
- 只用inner join或者left join;禁止用right join。表关联的on必须有索引,只关联需要表,只选择需要的列。
- 复杂查询拆分简单查询;尽量小批量小语句分段执行,一个sql不要超过1G的binlog。小语句小事务好处:减少锁、用上多cpu,缓存命中率高。
- 大事务可以set auto_commit =0 关闭自动提交,但是拒绝滥用,会导致阻塞。
- 注意SQL语句中数据类型隐式转换的问题。查询条件中使用‘’可能导致类型转换无法使用索引,比如:int_col=‘0’,会导致隐式转换无法正常使用索引。