优化分为六大部分:
- SQL语句的优化
- 索引的优化
- 表结构的优化
- 事务优化
- 系统配置优化
- 物理机的优化
- SQL语句的优化
a. 尽量使用select 字段名,不要使用select *,select *不能使用索引覆盖。只查需要用到的列。
b. 小表驱动大表。主查询 in/exists 子查询.
ⅰ. in 先执行右边的子查询再执行主查询。in 适用于左边大表,右边小表。
ⅱ. exists 先执行左边的主查询然后执行子查询。exists 适用于左边小表,右边大表
ⅲ. 核心是先查小表,再查大表
c. 使用 join 代替子查询,join不要连接过多的表
d. insert update delete 数据时,批量进行操作。不要循环,一条条的插入
e. 多用limit,减少不必要的查询和返回。
f. 使用group by时,首先使用where 减小数据量,分组时效率会高 - 索引的优化
a. explain 查看执行计划,看是否走索引。
b. select \order by 字段使用索引
c. 控制索引的数量,阿里规约:一个表5个索引,并且单个索引中的字段数不超过5个。因为insert update delete操作需要维护索引。
d. 联合索引时,遵守最左匹配原则
e. 不在索引列上进行计算、函数 - 表结构的优化
a. 合理的表结构
b. 适当冗余
c. 尽量使用not null字段。null 字段会多使用一个字节来记录是否为null。
d. 合理的字段类型。
ⅰ. 尽量选择数字类型,因为数字的处理速度快于字符串的处理速度
ⅱ. 尽可能使用小的类型,比如:用bit存布尔值,用tinyint存枚举值等
ⅲ. 长度固定的字符串字段,用char类型
ⅳ. 长度可变的字符串字段,用varchar类型
ⅴ. 金额字段用decimal,避免精度丢失问题 - 事务优化
a. 避免长事务
b. 减少锁定的时间长度和资源数 - 系统配置优化
a. 慢查询默认是关闭的,生产环境需要关闭,开发环境打开,会有一定的性能损耗。开启的命令set global slow_query_log='ON'
;
b. 调整redolog的size。这个size小了,会导致频繁的刷盘,效率会降低。InnoDB特有的。 - 物理机的优化
a. 更大的内存、磁盘(高速读写)、网络带宽、CPU