跳至主要內容

MySQL分库分表

苏文广大约 1 分钟MySQLMySQLJava

MySQL分库分表

为什么要分库分表

需要分库分表的情况无非是数据库性能无法满足业务要求;

  1. 读慢

    数据量过大,导致InnoDB的存储文件<表名>.ibd过大, MySQL需要先将ibd文件读取到内存中进行查找,然后将数据返回给客户端

    • 磁盘IO可能成为瓶颈, 读取文件
    • CPU内存查找可能成为瓶颈, 查找
    • 网络传输可能成为瓶颈
  2. 写慢

    数据量过大,导致InnoDB的存储文件<表名>.ibd过大, MySQL需要先将ibd文件读取到内存中进行查找写入位置, 然后将数据写入, 如果写不会导致B+树结构变化, 那么是用乐观锁写入, 如果写入数据会导致B+树的索引结构变化(新增页),那么是分段悲观锁写入的方式, 这种方式是串行的;

    • 磁盘IO可能成为瓶颈, 读取文件, 写入文件(新增页)
    • CPU内存查找
    • 网络传输可能成为瓶颈
    • 读写锁机制更新索引B+树
      总结下来, 其实更多是写锁导致的并发性能问题
  3. 并发慢

    但数据库的连接数却是有限的,在高并发场景下多个业务同时对一个数据库操作,很容易将连接数耗尽导致too many connections报错,导致后续数据库无法正常访问。