影响数据库性能的因素

影响数据库性能的因素

  • 影响数据库性能的因素
    • sql查询速度
    • 服务器硬件
    • 网卡流量
    • 磁盘IO
    • 网卡流量
    • 大表
    • 大事务

QPS & TPS

QPS:每秒钟处理的查询量

  • eg:
    • 一个cpu 10ms 处理 1个sql,
    • 1s 处理 100个sql,那么QPS<=100
    • 一个cpu 100ms处理 1个sql,QPS<=10

TPS:

  • 超高的QPS和TPS带来的风险:效率低下的SQL

数据库的性能问题大部分都是由于sql的慢查询造成的,大部分问题可以通过对sql的优化得到解决。

并发量 & CPU使用率

并发量:同一时间处理的请求的数量;与同时连接数不同。

空闲的百分比值越高空闲率越高。

  • 大量的并发和超高的CPU使用率

大量的并发:数据库连接数被占满。(max_connections默认100)

超高的CPU使用率:因cpu资源耗尽而出现宕机。

磁盘IO

数据库备份远程同步计划任务会导致IO达到峰值。

  • 最好不要在主库上数据库备份
  • 大型活动前取消这类计划

风险:

磁盘IO性能突然下降(使用更快的磁盘设备)

其他大量消耗磁盘性能的计划任务(调整计划任务,做好磁盘维护)

  • 数据库扩展需要完整性和一致性

网卡流量

网卡IO被占满(1000Mb/8 约等于 100MB)

  • 如何避免无法连接数据库的情况:
    • 减少从服务器的数量
    • 进行分级缓存
    • 避免使用 select * 进行查询
    • 分离业务网络和服务器网络

大表

  • 记录行数巨大,单标超过千万行

  • 表数据文件巨大,表数据文件超过10G

  • 第一、 大表对查询的影响:

    • 慢查询:很难再一定的时间内过滤出所需要的数据。
    • 查询的维度区分度比较低(只有几个维度,例如三方登录字段:只有微信、qq几个有限的维度,查询的数据量就比较大),会产生大量磁盘IO,降低磁盘效率。
  • 第二、大表对DDL操作的影响:

    • 建立索引需要很长的时间
    • Mysql 版本 < 5.5 建立索引会锁表
    • Mysql 版本 >= 5.5 虽然不会锁表,但会引起主从延迟
    • 大表对DDL操作的影响:修改表结构需要长时间锁表。
    • 风险:会造成长时间的主从延迟。影响正常的数据操作。
  • 如何处理数据库中的大表:

      1. 分库分表把一张大表分成多个小表。
      • 难点:
      • 分表主键的选择;分表后跨分区数据的查询和统计。
      1. 大表的历史数据归档:
      • 减少对前后端业务的影响
      • 难点:归档时间点的选择。如何进行归档操作。

大事务

  • 什么是事务?

    • 事务是数据库系统区别于其他一切文件系统的重要特征之一
    • 事务是一组具有原子性的sql语句,或是一个独立的工作单元
  • 特点:原子性、一致性、隔离性、持久性

  • 事务原子性 atomicity:

    • 一个事务被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作
    • 银行例子:1. 取钱 2.存钱
  • 事务的一致性 consistency:

    • 一致性是指事务将数据库从一种一致性状态转换到另外一种一致性状态,在事务开始之前和事务结束后数据库中数据的完整性没有被破坏
  • 事务的隔离性 isolation:

    • 隔离性要求一个事务对数据库中数据的修改,在未提交完成前对于其它事务是不可见的
    • SQL标准中定义的四种隔离级别:
      • 未提交读(READ uncommited)
      • 已提交读(READ commited)(不可重复读)
      • 可重复读(repeatable READ)
      • 可串行化(serializable)
    • 隔离性由低->高,并发性由高->低
  • 事务的持久性 durability:

    • 一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,已经提交的修改数据也不会丢失
  • 大事务:

    • 运行时间比较长,操作的数据比较多的事务
    • 风险:
      • 锁定太多的数据,造成大量的阻塞和锁超时
      • 回滚时所需时间比较长
      • 执行时间长,容易造成主从延迟
  • 如何处理大事务:

    • 避免一次处理太多的数据
    • 移除不必要在事务中的select操作