影响数据库的因素
- 服务器硬件性能
- 磁盘IO
- sql查询速度
- 网卡流量
QPS: 每秒钟处理的查询量
TPS: 每秒钟处理的事务数
并发量:同一时刻所需要数据服务器做处理的请求的数量
连接量:往往要比并发量大得多,是客户端与数据库服务器建立的链接数量
超高的QPS 和 TPS
10ms 处理一个sql => 1s 处理 100个sql => QPS => 100
100ms处理一个sql => 1s 处理 10 个sql => QPS => 10
数据库性能 80%是由于慢查询引起的,即大部分的数据库性能问题可以通过sql优化来解决。
大量的并发和超高的CPU使用率所带来的风险
- 大量的并发:数据库连接数被沾满(max_connection默认100)
- 超高的CPU使用率:因CPU资源耗尽而出现宕机
磁盘IO
数据库的只要瓶颈
- 磁盘IO性能突然下降(热数据远远大于服务器可用内存=>使用更快的磁盘设备)
- 其他大量的消耗磁盘性能的计划任务(调整计划任务、做好磁盘维护)
网卡流量
- 网卡IO被沾满(1000Mb/8 ≈ 100MB)
- 减少从服务器的数量
- 进行分级缓存
- 避免使用select * 进行查询
- 分离业务网络和服务器网络
大表带来的问题
什么是大表:
1. 记录行数巨大,单表超过千万行
2. 表数据文件巨大,表数据文件超过10G
大表对查询的影响:
慢查询:很难再一定的时间内过滤出所需的数据
大表对DDL的影响:
1. 建立索引需要很长的时间
1). Mysql版本<5.5 建立索引会锁表
2). Mysql版本>=5.5 虽然不会锁表,但会引起主从延迟
2. 修改表结构需要长时间锁表
1). 会造成长时间的主从延迟
2). 影响正常的数据操作(会阻塞)
如何处理数据库中的大表问题
分库分表把一张大表分成多个小表
难点: 分表主键的选择 分表后跨分区数据的查询和统计
大表的历史数据归档(减少对前后端业务的影响)
难点: 归档时间点的选择 如何进行归档操作
大事务带来的问题
1. 事务是数据库系统区别与其他一切文件系统的重要特性之一
2. 事务是一组具有原子性的sql语句,或是一个独立执行的单元
3. 事务需要符合的四大特性:①原子性(ATOMICITY) ②一致性 (CONSISTENCY)③ 隔离性 (ISOLATION)④持久性
定义:一个事务必须是一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败,对于一个事务来说,不可能只执行其中的一部分操作
事务原子性(ATOMICITY):整个事务要么全部提交成功,要么全部失败回滚
事务一致性(CONSISTENCY):一致性是指将数据库从一种一致性状态转换到另一种一致性状态,在事务开始之前和事务结束后数据库中数据的完整性没有被破坏
事务隔离性(ISOLATION):隔离性要求一个事务对数据库中数据的修改,在未提交完成前对于其他事务是不可见的
SQL标准中定义了四中隔离级别:(隔离性由低到高,并发性有高到低)
1. 未提交读(READ UNCOMMITED),会产生脏读
2. 已提交读(READ COMMITTED)
3. 可重复读(REPEATABLE READ)
4. 可串行化(SERIALIZABLE)
事务持久性(DURABILITY):一旦事务提交,则其所做的修改就会永久保存到数据库中,此时系统崩溃,已提交的修改数据也不会丢失。
mysql查看隔离级别:show variables like '%iso%';
mysql修改隔离级别:(可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.)
①修改mysql.ini:
[mysqld]
transaction-isolation = REPEATABLE-READ
②客户端修改:
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]
innodb默认的隔离级别是可重复度(REPEATABLE READ)
所谓的大事务就是:运行时间比较长,操作数据比较多的事务
问题:
1. 锁定太多的数据,造成大量的阻塞和锁超时
2. 回滚需要的时间比较长,会锁定回滚所需要的行,所需时间甚至比修改所需时间还要长。
3. 执行时间长,容易造成主从延迟
如何处理大事务:
1. 避免一次处理提多的数据
2. 移出不必要在事务中的SELECT操作