影响MySql性能的几大因素
- SQL语句执行效率低;
- 配置未优化;
- 表设计不合理;
- CPU或内存瓶颈;
- 磁盘I/O瓶颈;
- 网卡流量瓶颈;
- 大型事务操作;
SQL语句执行效率低下
效率的指标是QPS和TPS。
如果一条查询的SQL语句执行一次耗时是10ms的话,那么理论上每秒能执行100次,这时理论上应该是QPS≤100的。
如果一条查询的SQL语句执行一次耗时是100ms的话,那么理论上每秒能执行10次,这时理论上应该是QPS≤10的。
MySql默认的连接数是100个,如果查询的请求过多,执行速度慢的话(QPS≤10),会造成连接数耗尽,原因在于大量的连接在等待。
配置未优化
配置的优化这里,就像上面提到的默认的连接数,根据软件的需求来合理的调整配置是非常重要的。
表设计不合理
就一些大公司的经验来看,单表大于一千万行,或者大于10G都属于大表范围,大表会带来的问题如下:
- 慢查询;
- 执行DDL等操作,或添加索引等耗时很长;
- 修改表结构会造成锁表,从而导致主从延迟,如果主库请求阻塞会造成连接数猛增,导致无法获取数据库连接;
解决方法:
- 可以选择分库分表,但是要选择好分片的主键,并且准备好分区查询和统计带来的复杂度;
- 可以选择将大表的历史数据归档到历史表,业务表中只保存短期内的业务数据;
CPU或内存瓶颈
如果不是因为异常情况导致CPU使用率耗尽,或者内存空间不足,则需要考虑提升服务器的硬件配置。
磁盘I/O瓶颈
要谨慎的在数据库服务器上执行复杂的计划任务,复杂的计划任务可能会带来大量的磁盘I/O操作,从而导致磁盘I/O打到瓶颈。例如在某些大量用户线上活动时,最好先暂停那些耗费性能的计划任务(统计,备份,清理等等)。
网卡流量瓶颈
目前服务器的网卡大小大多是千兆网卡,千兆指的是小b,如果换算成大B可以约等于100MB,在数据库服务器上要减少带来大量网络传输的事件,例如:
- 减少从服务器的数量,变量减少了数据同步带来的网络传输消耗;
- 减少select *这种SQL查询操作;
- 可以加入分级缓存机制,避免单级缓存雪崩,造成大量的读操作,占满带宽;
大型事务操作
事务的特性是A(原子性)C(一致性)I(隔离性)D(持久性)。
其中,隔离性有几种隔离级别:
- 读未提交,会造成脏读;
- 读已提交,会造成不可重复度;
- 可重复读,会造成幻读,MySql默认的隔离界别;
- 序列化;
大事务是指,运行时间长的,操作事务较多的执行任务,这会带来一些风险:
- 事务会造成锁定数据,有可能造成大量连接阻塞或执行超时;
- 如果事务失败,回滚的时间会非常长;
- 会造成主从延迟的同步;
对于这种情况,也有一些解决方法:
- 对于大量的数据,可以分批次执行数据处理;
- 检查事务中的SQL语句,看看是否有不必要的SELECT操作;