对数据库性能影响的几个方面
大表对数据库性能的影响
- 大表的一般定义
- 记录行数巨大(单表超过千万行)
- 表数据文件巨大(超过10G)
- 大表对查询的影响
- 慢查询:很难在一定的时间内过滤出所需要的数据
- 来源少,区分度低,大量的磁盘IO,降低磁盘效率,大量慢查询
- 大表对DDL操作的影响
- 建立索引需要很长的时间
- 风险:MySQL版本<5.5 建立索引会锁表,MySQL版本>=5.5虽然不会锁表但是会引起主从延迟
- 修改表结构需要长时间锁表
- 风险:会造成长时间的主从延迟;影响正常的数据操作;
- 建立索引需要很长的时间
- 处理数据库中的大表
- 分库分表把一张大表分成多个小表
- 难点:分表主键的选择; 分表后跨分区数据的查询和统计
- 大表的历史数据归档
- 减少对前后端业务的影响
- 难点:归档时间点的选择
- 分库分表把一张大表分成多个小表
大事务对数据库性能的影响
-
什么是事务
- 事务是数据库系统区别于其它一切文件系统的重要特性之一
- 事务是一组具有原子性的SQL语句,或是一个独立的工作单元
-
事务的原子性
-
事务的一致性
-
事务的隔离性(隔离性要求一个事务对数据库中数据库的修改,在未提交完成前对于其他事务是不可见的)
- 未提交读(脏读)
- 已提交读(不可重复读)
- 可重复读 (innodb的默认隔离级别)
- 可串行化(最糟糕的隔离级别,锁严重)
-
事务的持久性
-
什么是大事务
- 定义:运行时间比较长,操作的数据比较多的事务
- 风险
- 锁定太多的数据,造成大量的阻塞和锁超时
- 回滚所需时间比较长
- 执行时间长,容易造成主从延迟
-
如何处理
- 避免一次处理太多的数据
- 移出不必要在事务中的SELECT操作
-
服务器硬件,CPU、内存、磁盘IO
-
服务器操作系统
-
数据库存储引擎的选择(插件式的存储引擎)
- MyISAM:不支持事物,表级锁
- InnoDB:事物级存储引擎,完美支持行级锁,外键,事务ACID特性
-
数据库参数配置
-
数据库结构设计和SQL语句
服务器硬件对性能的影响
- 如何选择CPU
- 频率&数量
- 是否是CPU密集型(更好的CPU)
- MySQL不支持多CPU对同一SQL并发处理
- 系统并发量(更对的CPU)
- 衡量数据库处理能力的指标(QPS:同时处理SQL的数量)
- web类应用:核心数量比频率重要
- 内存提高数据库性能
- MyISAM索引缓存内存,数据用OS缓存
- InnoDB在内存中缓存索引和数据
- 磁盘的配置和选择
- 传统机器硬盘(常见,使用最多,价格低,存储空间打,读写慢)
- 存储容量、传输速度、访问时间、主轴转速、物理尺寸
- 使用RAID增加传统机器硬盘的性能
- RAID是磁盘冗余队列的简称(多个容量小的磁盘组成一组容量大的磁盘,并提供数据冗余来保证数据完整性的技术)
- RAID 0 磁盘串行,没有提供冗余或错误修复能力
- RAID 1 磁盘镜像,最大限度保证系统的可靠性和可修复性
- RAID 5 分布式奇偶校验磁盘阵列,两块磁盘出现问题则无法修复,以读为主的,从数据库服务器
- RAID 10数据库最好的选择,先做RAID1之后在对两组RAID1做RAID0,相对于RAID5重建起来更简单,速度也更快
- 传统机器硬盘(常见,使用最多,价格低,存储空间打,读写慢)
等级 | 特点 | 是否冗余 | 盘数 | 读 | 写 |
---|---|---|---|---|---|
RAID0 | 便宜,快速,危险 | 否 | N | 快 | 快 |
RAID1 | 高速读,简单安全 | 有 | 2 | 快 | 慢 |
RAID5 | 安全,成本折中 | 有 | N+1 | 快 | 取决于最慢的盘 |
RAID0 | 贵,高速,安全 | 有 | 2N | 快 | 快 |