Mysql高性能笔记
影响数据库的因素
- sql查询速度
- 服务器硬件
- 网卡流量
- 磁盘IO
超高的QPS(每秒查询速度)和TPS(每秒事务量)
- 风险:效率底下的SQL
假设只有一个CPU,让我们来看下面这张图:
image.png可以看到对比,100ms的低效率的慢查询看似不大,但是对数据库压力很大。提高数据库性能之一就是优化那些效率低下的sql,提高性能,提高QPS。
大量的并发和超高的CPU使用率
风险:
- 大量的并发:数据库连接数被沾满(max_connections默认是100,在实际生产中我们要修改变大)
- 超高的CPU使用率:因为CPU资源耗尽而出现宕机。
磁盘IO
风险:
- 磁盘IO性能突然下降(使用更快的磁盘设备)
- 其他大量消耗磁盘性能的计划任务(调整计划任务,做好磁盘维护)。
网卡流量
风险:
- 网卡IO被沾满(1000Mb/8约等于100MB)
如何避免:
- 减少从服务器的数量
- 进行分级缓存
- 避免使用’select *‘
- 分离业务网络和服务器网络
还有什么会影响数据库性能?
什么样的表可以被称为大表:
- 记录行数巨大,单表超过千万行
- 表数据文件巨大,表数据文件超过10G
- 还是要灵活运用
大表对查询的影响:
- 慢查询:很难在一定的时间内过滤出所需要的数据。
-
大表建立索引需要很长的时间。Mysql < 5.5 建立索引会锁表。Mysql > 5.5 不会锁表,但是会主从延迟。
image.png
订单来源有四家,那么查询的时候会产生慢查询。
因为我们查询的时候,订单来源比较少,区分度比较低,会产生大量的磁盘IO,进而降低磁盘效率,导致大量的慢查询。 这个时候如果把订单来源进行分表的话对减少数据库的IO压力,增强QPS。
大表对DDL操作的影响:
- 修改表结构需要长时间锁表
- 会影响正常的数据操作
风险:会造成长时间的主从延迟。
如何处理数据库中的大表:
- 分库分表把一张大表分成多个小表。
难点:
- 分表主键的选择
- 分表后跨区数据的查询和统计
- 对大表进行历史数据归档 减少对前后端业务的影响
难点:
- 归档时间点的选择
- 如何进行归档
什么是事务?
- 事务的数据库系统区别于其他一切文件系统的重特性之一。
- 事务是一组具有原子性的SQL语句,或是一个独立的工作单元。
事务的四个特性:
- 原子性
- 一致性
- 隔离性
- 持久性
什么是大事务?
定义:运行的时间比较长,操作的数据比较多的事务。
风险:锁定太多的数据,造成大量的阻塞和锁超市,回滚时所需要的时间比较长,执行时间长,太容易造成主从延迟。
所以我们要避免一次处理太多的数据。移出不必要在事物中的SELECT操作。
网友评论