调优金字塔:
1.硬件和OS调优:
非DBA,只做简述。硬件有CPU、RAID卡,操作系统有IO调度策略、内存、设备轮转模式等。
2.MySQL调优:
(1)配置优化
· 足够大的缓冲池(innodb_buffer_pool_size)
将热点数据尽可能多的存放到内存中,读取数据时就会尽可能少的访问磁盘。
· 最合适的redo log配置
增大redo_log的写入缓冲区大小(innodb_log_file_size)来降低redo log file的循环切换频率,一般是设置为缓冲池大小的四分之一,但是这样会增大宕机恢复时的时间消耗;
选择合适的刷盘策略(innodb_flush_log_at_trx_commit)。如果当前业务对于数据的安全性要求没有那么严格,或者基础架构足够安全,或者事务一般都很小,可以用0或2来降低刷盘频率;
避免双写入缓冲(innodb_flush_method=O_DIRECT)。如果OS和MySQL的缓冲都写入的话,对于内存的占用就翻了倍。除非操作系统不支持,不然没有任何理由打开双写入缓冲。
(2)索引优化
索引的合理性可以直接看作是索引的创建策略,然后尽可能的满足三星索引。
(3)SQL优化
SQL语句的合理性可以通过explain来分析,尽量避免一些耗性能的type或extra出现。
慢查询调优思路:
1.数据层
· 是否请求了不需要的数据,比如不需要的列、不需要的记录、重复的记录等
· 是否扫描了额外的记录,比如扫描的行数远大于返回的行数、访问类型等。
2.索引层:
主要就是看索引是否失效。
3.考虑重构
· 将一个复杂查询拆成多个简单查询会不会好一些
· 将一个大数据量大查询分批返回结果
· 将关联查询分解(缓存效率更高;减少锁的竞争;利于高性能和可扩展;减少冗余数据的查询)
· 避免使用大事务,使用短小的事务减少锁的竞争
· 延迟关联来优化分页
· 不使用存储过程,触发器
· 不使用负向查询,如not in, not like等
· sql中使用到的or改写为用in()
· 禁止使用子查询,因为子查询需要创建和销毁临时表
· join查询小表驱动大表
3.架构调优
垂直拆分、水平拆分、引入缓存系统。