目录

探讨一下大促销当中数据库可能出现的问题

究竟哪些东西可以影响到我们服务器的性能呢?

无非就是:CPU、磁盘IO、内存等等一系列硬件

在研究性能时候,先带大家来了解三个术语

  • QPS: 每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,简言之就是数据库每秒能查多少数据

  • TPS: 服务器每秒处理的事务数。TPS包括一条消息入和一条消息出,加上一次用户数据库访问。(业务TPS = CAPS × 每个呼叫平均TPS

  • 并发量: 同一时间处理请求的数量,注意不要和同时连接数搞混,连接数要比并发量多的多的多

如果存在超高的QPS和TPS

  • 效率低下的SQL

在访问量急剧增大的情况下,数据库每秒能处理多少个QPS就显得很重要了。

假设我们现在只有一个CPU进行处理SQL语句

  • 10ms处理1个SQL

  • 1s处理100个SQL

  • QPS<=100

在假设如果处理SQL语句的时间变长

  • 100ms处理一个SQL
  • 1s处理10个SQL
  • QPS<=10

解决方法

  • 80%的数据库QPS可以通过优化SQL语句来进行一定的优化.

大量的并发和超高的CPU

  • 大量的并发: 数据库连接数被占满(导致网页提示503)
  • 超高的CPU使用率: 因CPU的资源耗尽出现了宕机

解决方法

  • 你需要设置一下MySQL的最大连接数max_connections
  • 选择性能更高的CPU

磁盘IO

风险

  • 磁盘IO性能突然下降

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

解决方法

  • 使用更快的磁盘设备

网卡流量

风险

  • 网卡流量被占满导致无法连接数据库

解决方法

  • 减少从服务器的数量
  • 进行分级缓存
  • 避免使用select *进行查询
  • 分离业务网络和服务器网络

大表

  • 记录行数巨大,单表超过千万行
  • 表数据文件巨大,表数据文件超过10GB

大表对查询的影响

  • 慢查询: 很难在一定的时间内过滤出所需要的数据

大表对DDL语句操作的影响

  • 建立索引需要很长时间

    • 如果MySQL版本<5.5建立索引会被锁表
    • 如果MySQL版本>=5.5虽然不会被锁表但是会引起主从延迟
  • 修改表结构需要长时间锁表

    • 同建立索引一样,会造成长时间的主从延迟

    • 影响正常数据的操作,阻塞数据

因为所有的Insert语句都会阻塞,都需要等到你的表结构修改完成后才能处理。

解决数据库中的大表

分库分表把一张大表分成多个小表

难点

  • 分表主键的选择
  • 分表后跨分区数据的查询和统计
  • 可能会影响后端业务,需要大量的人力物力

大表的历史数据归档

优点

  • 减少对前后端业务的影响

难点

  • 归档时间点的选择
  • 如何进行归档操作