MySQL 影响数据库服务器的一些因素

sqlercn | | 访问(70)

  1、并发量:同一时间处理请求的数量

  2、CUP使用率

  3、数据库同时连接数量

  4、网卡流量(网卡IO会占满)

  5、磁盘IO(使用更快的磁盘设备)

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

  TPS和QPS的介绍

  TPS:Transactions Per Second(每秒传输的事物处理个数)

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

  TPS是软件测试结果的测量单位。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。

  一般的,评价系统性能均以每秒钟完成的技术交易的数量来衡量。系统整体处理能力取决于处理能力最低模块的TPS值。

  QPS:每秒钟处理的查询量

  QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,在因特网上,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。对应fetches/sec,即每秒的响应请求数,也即是最大吞吐能力。

  例如:10ms c处理 1个sql,1s 处理 100 个sql,那 QPS<=100; 100ms处理 1个sql QPS<=10; 一个sql 处理速度 10毫秒 和100毫秒 差距巨大。

  超高的QPS和TPS

  风险:效率低下的SQL

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

  大量的并发会导致数据库连接数占满,超高的CPU使用率会导致CPU资源耗尽而出现宕机。

  MySQL max_connections 默认连接数 100,如果并发101个请求,那第101个请求将无法请求数据库,尽量将max_connections数设置的大一些。

  如何避免无法连接数据库的情况

  1、减少从服务器的数量,数据库主从服务器,从服务器过多会导致 同步数据时占用流量

  2、进行分级缓存

  分级缓存可提升后端存储内某些(热点)数据的 I/O 性能。分级缓存需创建一个由高速而昂贵存储设备(如 SSD )组成的存储池、作为缓存层,以及一个相对低速/廉价设备组成的后端存储池(或纠删码编码的)、作为经济存储层。 Ceph 的对象处理器决定往哪里存储对象,分级代理决定何时把缓存内的对象刷回后端存储层;所以缓存层和后端存储层对 Ceph 客户端来说是完全透明的。

  3、避免使用 " SELECT * " 进行查询,查询没必要的列浪费资源

  4、分离业务网络和服务器网络,例如,定时任务备份数据库,尽量备份从服务器,从而减少主服务器压力。

  大表,对数据库性能的影响

  1、记录行数巨大,单表超过千万行

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

  带来的问题:

  1、慢查询,很难在一定时间内过滤出所有需要的数据

  2、大表建立索引时间长(小于5.5版本建立索引会锁表,5.5及以上版本不会锁表但会引起主从延迟)

  3、主库修改表结构需要长时间锁表,会造成长时间的主从延迟(锁表后,进行添加编辑删除操作会占满数据库连接数)

  解决办法:

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

  难点:分表主键的选择,分表后跨分区数据的查询和统计

  2、大表的历史数据归档(减少对前后端业务的影响)

  难点:归档时间点的选择,如何进行归档操作

  大事务,对数据库性能的影响

  事务特性:原子性、一致性、隔离性、持久性

  原子性:一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败,对于一个事务来说,不可能只执行其中的一部分操作。

  一致性:一致性是指事务将数据库从一种一致性状态转换成另一种一致性状态,在事务开始之前和事务结束之后数据库中数据的完整性没有被破坏。(A给B转账100,在转移的过程中,这100是不会变的!)

  隔离性:隔离性要求一个事务对数据库中数据的修改,在未提交完成前对于其他事务是不可见的。

  四种隔离级别,未提交读(READ UNCOMMITED)、已提交读(READ COMMITED)、可重复读(REPEATABLE READ)、可串行化(SERIALIZABLE)

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

  大事务,就是运行时间比较长,操作的数据比较多的事务

  带来的问题:

  1、锁定太多数据,造成大量的阻塞和锁超时

  2、回滚时所需要的时间比较长

  3、执行时间长,容易造成主从延迟

  解决办法:

  1、避免一次处理太多的数据(分批处理)

  2、移除不必要在事务中的SELECT操作