如何优化mysql
- 避免使用select *,select *不会走覆盖索引
- 用union all代替union
- 使用union关键字后,可以获取排重后的数据
- union all关键字,可以获取所有数据,包含重复的数据
- 小表驱动大表
- in 适用于左边大表,右边小表
- exists 适用于左边小表,右边大表
- 批量操作
- 建议每批数据尽量控制在500以内。如果数据多于500,则分多批次处理
- 多用limit
- in中值太多
- 可以在sql中对数据用limit做限制
- 增量查询
- 按id和时间升序,每次只同步一批数据,这一批数据只有100条记录。每次同步完成之后,保存这100条数据中最大的id和时间,给同步下一批数据的时候用
- 高效的分页
- 先找到上次分页最大的id,然后利用id上的索引查询。不过该方案,要求id是连续的,并且有序的。
- 使用between优化分页
- 用连接查询代替子查询
- mysql执行子查询时,需要创建临时表,查询完毕后,需要再删除这些临时表,有一些额外的性能消耗
- join的表不宜过多
- join时要注意
- left join:求两个表的交集外加左表剩下的数据
- inner join:求两个表交集的数据
- 控制索引的数量
- 单表的索引数量应该尽量控制在5个以内,并且单个索引中的字段数不超过5个
- 选择合理的字段类型
- 能用数字类型,就不用字符串,因为字符的处理往往比数字要慢。
- 尽可能使用小的类型,比如:用bit存布尔值,用tinyint存枚举值等。
- 长度固定的字符串字段,用char类型。
- 长度可变的字符串字段,用varchar类型。
- 金额字段用decimal,避免精度丢失问题
- 提升group by的效率
- group by关键字,它主要的功能是去重和分组
- 索引优化
- explain命令,查看mysql的执行计划
- [图解]
- 索引失效的常见原因
- [图解]
- 1.索引的优化 只要列中含有NULL值,就最好不要在此例设置索引,复合索引如果有NULL值,此列在使用时也不会使用索引
尽量使用短索引,如果可以,应该制定一个前缀长度
对于经常在where子句使用的列,最好设置索引,这样会加快查找速度
对于有多个列where或者order by子句的,应该建立复合索引
对于like语句,以%或者‘-’开头的不会使用索引,以%结尾会使用索引
尽量不要在列上进行运算(函数操作和表达式操作)
尽量不要使用not in和<>操作 - 2.sql语句的优化 查询时,能不要就不用,尽量写全字段名 大部分情况连接效率远大于子查询
多使用explain和profile分析查询语句
查看慢查询日志,找出执行时间长的sql语句优化
多表连接时,尽量小表驱动大表,即小表 join 大表
在千万级分页时使用limit
对于经常使用的查询,可以开启缓存 - 3.表的优化表的字段尽可能用NOT NULL 字段长度固定的表查询会更快 把数据库的大表按时间或一些标志分成小表 将表分区