1. 硬件和操作系统层面的优化
从硬件层面来说,影响MySQL性能因素主要是CPU,可用内存大小,磁盘读写速度,网络带宽。从操作系统层面来说,应用文件句柄数,操作系统的网络配置,都会影响到MySQL的性能。主要观察服务本身所承载的体量,然后提出合理的指标要求,避免出现资源浪费的一个现象。
2. 架构设计层面的优化
MySQL是一个磁盘IO访问,非常频繁的关系型数据库,在高并发和高性能的场景中,MySQL数据库必然会承受巨大的并发压力,在此时我们的优化的方式,主要可以分为几个部分:
(1) 第一个是搭建MySQL主从集群,单个MySQL服务容易去导致单点故障,一旦服务宕机,将会导致依赖MySQL数据库的应用,全部无法响应,主从集群或者主主集群,都可以去保证服务的高可用性。
(2) 读写分离设计,在读多写少的场景中,通过读写分离的方案,可以去避免读写冲突,导致的性能问题。
(3) 引入分库分表的机制,通过分库可以降低单个服务器一个IO压力。通过分表的方式,降低单表数据量,从而去提升sql的查询效率。
(4) 针对热点数据,可以引入更为高效的分布式数据库,如Redis、MongoDB等,他们可以很好的减轻MySQL的访问压力,同时还能提升数据的检索性能
3. MySQL程序配置优化
MYSQL是一个经过互联网大厂检验过的生产级别的成熟数据库,对于MySQL数据库本身的优化,一般可以通过MySQL配置文件my.cnf来完成。
第一个MySQL 5.7版本默认的最大连接数是151个,这个值可以再my.cnf中去修改。
第二个binlog日志默认不开启,可以开启。
第三个是缓存池Bufferpool默认大小配置,而这些配置一般是和用户的安装环境以及使用场景有关系,因此这些配置,官方只会提供一个默认的配置,具体的情况还需要使用者去根据实际情况去修改。
关于配置项的修改,需要关注两个层面,第一个是配置的作用域,它可以分为会话级别和全局范围。第二个是是否支持热加载,针对这两个点,我们需要注意的是,全局参数的设定,对于已经存在的会话是无法生效的,会话参数的设定,随着会话的销毁而失效。第三个是全局类的统一配置,建议配置在默认配置文件中,否则重启服务会导致配置失效。
4. SQL执行优化
(1) 慢SQL的定位和排查,我们可以通过慢查询日志和慢查询日志工具分析,得到有问题的SQL列表。
(2) 执行计划分析,针对慢SQL我们可以使用关键字explain来去查看当前sql的执行计划,可重点关注type,key,rows,filterd等字段,从而去定位该SQL执行慢的根本原因,再去有的放矢的进行优化。
(3) 使用show profile工具,这个工具是MySQL提供的可以用来分析当前会话中SQL语句资源消耗情况的工具,可以用于SQL调优的测量,在当前会话中,默认情况下,show profile是关闭状态,打开以后会保存,最近15次的运行结果,针对运行慢的SQL通过profile工具进行详细分析,可以得到SQL执行过程中所有资源的开销情况,比如io开销,cpu开销,内存开销。
sql优化规则
- SQL的查询一定要基于索引来进行数据扫描。
- 避免索引列上使用函数或者运算符。
- Where字句中like%号尽量放置在右边。
- 使用索引扫描,联合索引中的列从左往后,命中越多越好
- 尽可能使用SQL语句用到的索引完成排序
- 查询有效的列信息即可,少用*代替列信息
- 永远要用小的结果集驱动大的结果集