数据库架构-大表和大事务

一、什么样的表可以称之为大表

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

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

 

二、大表对查询的影响

1、慢查询的产生

在大表中,很难在一定时间内过滤出所需要的数据

2、对DDL操作的影响

建立索引需要很长时间,并且可能引起主从延迟

修改表结构需要长时间锁表,影响正常的数据库操作,并且会造成长时间的主从延迟

 

三、如何处理数据库中的大表

1、分库分表(不推荐)

分库分表就是把一张大表分成多个小表,但分表后跨分区数据的查询和统计

2、对大表进行历史数据归档

可以减少对前后端业务的影响(因为表结构并没有变化),比如当订单表记录数过多时,就可以对订单表就行数据归档。

在前端可以添加一个历史数据查询入口即可,实现了冷热数据分离,降低了单表容量。

 

四、简单说下事务

事务就是数据库系统中,一组不可分割的操作单元,所有操作要么全部成功,要么全部失败,不会只成功一部分

1、事务具有4个特性:

(1)原子性

数据库将一个事务内的所有操作视为一个整体,里面的每一个操作要么全部执行成功,要么全部执行失败

这里,小李账户扣减500元和小明账户增加500元两个操作会被视为一个整体,只有两个操作都成功了,这个事务才会提交并成功

(2)一致性

一致性是指数据从一种一致性状态转为另一种一致性状态

(3)隔离性

隔离性指一个事务对数据的修改,在提交该事务之前,对于其他事务,这个修改是不可见的

事务1开始执行,在执行完小李与小明的转账还未提交事务时,事务2开始执行了,这时虽然事务1已经完成了小李和小明的转账,但是因为事务1还未提交,所以事务2读取到的小李账户还是1000元。

注:这种情况下,事务的隔离级别是默认隔离级别,也就是已提交读。

除了已提交读,还有三种隔离级别,下面会介绍。

(4)持久性

持久性指一个事务一旦被提交了,那么对数据库中的数据的修改就是永久性的。

2、事务的四个隔离级别

(1)未提交读

未提交读指事务可以读取到其他事务已经操作但还未提交的数据

(2)已提交读(默认隔离级别)

已提交读隔离级别下,一个事务只能看到其他事务已经提交的操作结果,还没提交的事务相对于该事务而言是不存在的。

(3)可重复读

可重复读隔离级别下,在事务中,同样的一个SQL每次查询结果是相同的,不会因为实际数据发生改变而发生变化。

(4)串行化

事务的执行是串行化的,一个事务没有提交,另一个事务无法开始执行。

实际应用中,串行化隔离级别几乎不会用到

 

五、什么是大事务

运行时间比较长,操作的数据比较多的事务被称为大事务。

 

六、大事务带来的问题

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

回滚时间长

执行时间长,可能造成主从延迟

 

七、如何处理大事务

1、避免一次处理太多的数据

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