mysql优化,在我的了解下可以分为三种:
1:服务器层面的优化;
2:SQL设计层面的优化
3:SQL语句的优化
服务器层面的优化
1:你可以先看下你的buffer pool的使用率
show global status like ‘innodb_buffer_pool_pages_%’;
如果 Innodb_buffer_pool_pages_free | 0 | 0 就表示已经被用光
你可以适当的扩大buffer pool,理论上扩大到mysql内存的3/4 或者 4/5
这样可以最大限度的保证数据从内存读取而不是硬盘(内存和硬盘大家都懂得)
修改方式:
linux的my.cnf中增加innodb_buffer_pool_size = 设置值(带单位M/G)
重启mysql记得 修改配置文件,得重启
2:降低磁盘写入次数
a:redo log大的话,落盘次数少(这个有时间,我会增加一篇mysql innodb的架构设计)
一般innodb_log_file_size 设置成 innodb_buffer_pool_size * 0.25就可以了
b:通用查询日志、慢查询日志最好不开(生产上,你测试要用还是要开的)
bin-log得开呀,要不主从咋子办?
c:可以更改检查点落盘策略innodb_flush_log_at_trx_commit 0 1 2
3:从硬件上,提高磁盘读写
如果show profile中的 Sending data 大的不正常了,就要考虑这点了,毕竟脱离硬件谈软件,就是只想恋爱不想结婚呀!!!!!!!
4:内存预热
就是第一次查询会慢一点,但是第二次就会相对快一点
SQL层面的优化
1:设计统计表,对于实时性要求不高的需求,可以后台定时计算放入表中,查询的时候直接取
2:减少查询关联,创建合理的冗余字段------->别忘了修改数据的时候的数据一致性
3:字段太多的表,考虑拆表(这个是列拆,可不是行分)!
4:对于经常不适用的字段或者存储数据比较多的字段,考虑拆表,或者有字段是 blob 、text之类的,最好拆出去(这玩意得导致主键索引树多大呀)
5:每张表建议自己做int类型的主键,建议主键自增(分布式请雪花)
SQL语句优化
1:肯定不用说,是索引优化
where的字段中,组合索引,有没有按照最左前缀原则
执行计划一下,看看有没有索引下推
创建的组合索引,在查询的时候索引覆盖,不回表
on两边的字段都要创建索引
排序,分组使用索引列
不要使用*
2:limit优化(这个是在layer层,可以中断扫表)
3:小结果集关联大结果集
4:count优化
count (*) 找普通索引 ,找到最小的那棵树来遍历 包含空值
count(字段) 走缓存 不包含空值
count(1) 忽略字段 包含空值