1、读写分离
先来看主从复制。MySQL复制:为保证主服务器和从服务器的数据一致性,在向主服务器插入数据后,从服务器会自动将主服务器中修改的数据同步过来。
主从复制主要有三个线程:binlog线程、I/O线程、SQL线程。
- binlog线程:负责将主服务器数据更改写入到二进制日志(Binary log)中。
- I/O线程:负责从主服务器上读取Binary log,并写入从服务器的中继日志(Relay log)。
- SQL线程:负责读取Relay log,解析出主服务器已经执行的数据更改并在从服务器中重放。
读写分离主要依赖主从复制,主从复制为读写分离服务。
读写分离优势:
- 主服务器负责写,从服务器负责读,缓解了锁的竞争。
- 从服务器可以使用MyISAM,提升查询性能及节约系统开销
- 增加冗余,提高可用性。
2、垂直分表
垂直分表:将一个表按照字段分成多个表,每个表存储其中一部分字段。一般会将常用的字段放到一个表中。
垂直分表的优势:
- 提升常用数据的查询效率
- 避免I/O竞争,减少锁表的概率。因为大的字段效率更低,一:数据量大,需要的读取时间长;二:大字段占用的空间更大,单页内存储的行数变少,会使得I/O操作增多。
3、垂直分库
垂直分库:按照业务对表进行分类,部署到不同的数据库上面,不同的数据库可以放到不同的服务器上。
垂直分库的优势:
- 降低业务中的耦合,方便对不同的业务进行分级管理。
- 可以提升I/O、数据库连接数、解决单机硬件资源的瓶颈问题。
垂直拆分(分表、分库)的缺点:
- 主键出现冗余,需要管理冗余列。
- 事务处理变得更复杂。
- 仍然存在单表数据量过大的问题。
4、水平分表
水平分表:在同一个数据库内,把同一个表的数据按照一定规则拆分到多个表中。
水平分表的优势:
- 解决了单表数据量过大的问题。
- 避免I/O竞争并减少锁表的概率。
5、水平分库
水平分库:把同一个表的数据按照一定规则拆分到不同的数据库中,不同的数据库可以放到不同的服务器上。
水平分库的优势:
- 解决了单库大数据量的瓶颈问题。
- I/O冲突减少,锁的竞争减少,某数据库出现问题不影响其他数据库,提高了系统的稳定性和可用性。
水平拆分(分表、分库)的缺点: - 分片事务一致性难以解决。
- 跨节点JOIN性能差,逻辑会变得复杂。
- 数据扩展难度大,不易维护。
6、添加缓存
Mybatis中有一级缓存(Sqlsession)和二级缓存(Mapper)等等。
补充:分库、分表后,ID键如何处理?
设置全局ID,主要有以下几种方法:
- UUID:优点:本地生成ID,不需要远程调用;全局唯一不重复。缺点:占用空间大,不适合作为索引。
- 数据库自增ID:维护一个专门用于生成主键的库,让它来产生全局ID。
- Redis生成ID:优点:不依赖数据库,性能比较好;缺点:引入新的组件会使得系统复杂度增加。
- Twitter的snowflake算法:时一个64位的long型ID。其中1bit是不用的,41bit作为毫秒数,10bit作为工作机器ID,12bit作为序列号。
- 美团的Leaf分布式ID生成系统。