1. 影响数据库的因素
SQL查询速度、服务器硬件、网卡流量、磁盘IO
超高的QPS和TPS:效率低下的SQL。(QPS:每秒钟处理的查询量,TPS:每秒钟处理的事务数)
大量的并发:数据库连接数被占满(max_connection默认为100,按需要进行修改)
超高的CPU使用率:因CPU资源耗尽而出现宕机
磁盘IO:磁盘IO的性能突然下降(使用更快的磁盘设备),其它大量消耗磁盘性能的计划任务(调整计划任务)
网卡流量:网卡IO被占满,导致无法连接数据库。(减少从服务器的数量、进行分级缓存、避免使用“select *”进行查询、分离业务网络和服务器网络)
2. 影响数据库性能的因素
大表(记录行数巨大,单表超过千万行,表数据文件巨大,表数据文件超过10G)带来的影响:
- 慢查询:很难在一定时间内过滤所需要的数据
- 大表对DDL操作的影响:建立索引需要很长时间。
- 修改表结构需要长时间锁表(风险:会造成长时间的主从延迟,影响正常的数据操作)。MySQL版本 < 5.5 简历索引会引起锁表,MySQL版本 >= 5.5不会锁表但是会引起主从延迟。
大事务带来的影响:
(大事务:运行时间比较长,操作数据比较多的事务) - 锁定太多的数据,造成大量的阻塞和锁超时。
- 回滚时间比较长
- 执行时间长,容易造成主从延迟
避免大事务带来的影响方法: - 避免一次处理太多的数据
- 移出不必要在事务中的SELECT操作
3. 处理数据库中的大表
分库分表把一张大表分成多个小表:
难点 1:分表主键的选择、分表后跨分区数据的查询和统计- 大表的历史数据归档,减少对前后端业务的影响:
难点 2:归档时间点的选择、如何进行归档操作
4. 影响性能的几个方面
- 服务器硬件
- CPU:对于并发比较高的场景,CPU数量比频率重要。对于CPU密集型场景和复杂SQL则频率越高越好。
- 内存:选择主板能支持的最大频率
- IO子系统:PCIe > SSD > Raid > 磁盘 > SAN
- 服务器系统
- 数据库存储引擎的选择:
- MyISAM:不支持事务,使用的表级锁
- InnoDB:事务级存储引擎,完美支持行级锁,事务ACID特性。
- 数据库参数配置
- 数据库结构设计和SQL语句
- 过分的反范式化为表建立太多的列
- 过分的范式化造成太多的表关联
- 在OLTP环境中使用了不恰当的分区表
- 使用外键保证数据的完整性(效率很低)
5. 总结
性能优化顺序
- 数据库结构设计和SQL语句
- 数据库存储引擎的选择和参数配置
- 系统选择和优化
- 硬件升级