MySQL分库分表
大约 1 分钟
MySQL分库分表
为什么要分库分表
需要分库分表的情况无非是数据库性能无法满足业务要求;
读慢
数据量过大,导致InnoDB的存储文件
<表名>.ibd
过大, MySQL需要先将ibd文件读取到内存中进行查找,然后将数据返回给客户端- 磁盘IO可能成为瓶颈, 读取文件
- CPU内存查找可能成为瓶颈, 查找
- 网络传输可能成为瓶颈
写慢
数据量过大,导致InnoDB的存储文件
<表名>.ibd
过大, MySQL需要先将ibd文件读取到内存中进行查找写入位置, 然后将数据写入, 如果写不会导致B+树结构变化, 那么是用乐观锁写入, 如果写入数据会导致B+树的索引结构变化(新增页),那么是分段悲观锁写入的方式, 这种方式是串行的;- 磁盘IO可能成为瓶颈, 读取文件, 写入文件(新增页)
- CPU内存查找
- 网络传输可能成为瓶颈
- 读写锁机制更新索引B+树
总结下来, 其实更多是写锁导致的并发性能问题
并发慢
但数据库的连接数却是有限的,在高并发场景下多个业务同时对一个数据库操作,很容易将连接数耗尽导致too many connections报错,导致后续数据库无法正常访问。