影响MySql性能的几大因素

  1. SQL语句执行效率低;
  2. 配置未优化;
  3. 表设计不合理;
  4. CPU或内存瓶颈;
  5. 磁盘I/O瓶颈;
  6. 网卡流量瓶颈;
  7. 大型事务操作;

SQL语句执行效率低下

效率的指标是QPS和TPS。

如果一条查询的SQL语句执行一次耗时是10ms的话,那么理论上每秒能执行100次,这时理论上应该是QPS≤100的。

如果一条查询的SQL语句执行一次耗时是100ms的话,那么理论上每秒能执行10次,这时理论上应该是QPS≤10的。

MySql默认的连接数是100个,如果查询的请求过多,执行速度慢的话(QPS≤10),会造成连接数耗尽,原因在于大量的连接在等待。

配置未优化

配置的优化这里,就像上面提到的默认的连接数,根据软件的需求来合理的调整配置是非常重要的。

表设计不合理

就一些大公司的经验来看,单表大于一千万行,或者大于10G都属于大表范围,大表会带来的问题如下:

  1. 慢查询;
  2. 执行DDL等操作,或添加索引等耗时很长;
  3. 修改表结构会造成锁表,从而导致主从延迟,如果主库请求阻塞会造成连接数猛增,导致无法获取数据库连接;

解决方法:

  1. 可以选择分库分表,但是要选择好分片的主键,并且准备好分区查询和统计带来的复杂度;
  2. 可以选择将大表的历史数据归档到历史表,业务表中只保存短期内的业务数据;

CPU或内存瓶颈

如果不是因为异常情况导致CPU使用率耗尽,或者内存空间不足,则需要考虑提升服务器的硬件配置。

磁盘I/O瓶颈

要谨慎的在数据库服务器上执行复杂的计划任务,复杂的计划任务可能会带来大量的磁盘I/O操作,从而导致磁盘I/O打到瓶颈。例如在某些大量用户线上活动时,最好先暂停那些耗费性能的计划任务(统计,备份,清理等等)。

网卡流量瓶颈

目前服务器的网卡大小大多是千兆网卡,千兆指的是小b,如果换算成大B可以约等于100MB,在数据库服务器上要减少带来大量网络传输的事件,例如:

  1. 减少从服务器的数量,变量减少了数据同步带来的网络传输消耗;
  2. 减少select *这种SQL查询操作;
  3. 可以加入分级缓存机制,避免单级缓存雪崩,造成大量的读操作,占满带宽;

大型事务操作

事务的特性是A(原子性)C(一致性)I(隔离性)D(持久性)。

其中,隔离性有几种隔离级别:

  1. 读未提交,会造成脏读;
  2. 读已提交,会造成不可重复度;
  3. 可重复读,会造成幻读,MySql默认的隔离界别;
  4. 序列化;

大事务是指,运行时间长的,操作事务较多的执行任务,这会带来一些风险:

  1. 事务会造成锁定数据,有可能造成大量连接阻塞或执行超时;
  2. 如果事务失败,回滚的时间会非常长;
  3. 会造成主从延迟的同步;

对于这种情况,也有一些解决方法:

  1. 对于大量的数据,可以分批次执行数据处理;
  2. 检查事务中的SQL语句,看看是否有不必要的SELECT操作;
10-12 10:58