从零到千万用户,我是如何一步步优化MySQL数据库的?( 三 )


  • ID生成器:生成每张表的主键
  • 数据源路由:将每次DB操作路由到不同的分片数据源上
ID生成器ID生成器是整个水平分库的核心 , 它决定了如何拆分数据 , 以及查询存储-检索数据 。 ID需要跨库全局唯一 , 否则会引发业务层的冲突 。 此外 , ID必须是数字且升序 , 这主要是考虑到升序的ID能保证MySQL的性能(若是UUID等随机字符串 , 在高并发和大数据量情况下 , 性能极差) 。 同时 , ID生成器必须非常稳定 , 因为任何故障都会影响所有的数据库操作 。
我们系统中ID生成器的设计如下所示 。
从零到千万用户,我是如何一步步优化MySQL数据库的?文章插图
  • 整个ID的二进制长度为64位
  • 前36位使用时间戳 , 以保证ID是升序增加
  • 中间13位是分库标识 , 用来标识当前这个ID对应的记录在哪个数据库中
  • 后15位为自增序列 , 以保证在同一秒内并发时 , ID不会重复 。 每个分片库都有一个自增序列表 , 生成自增序列时 , 从自增序列表中获取当前自增序列值 , 并加1 , 作为当前ID的后15位
  • 下一秒时 , 后15位的自增序列再次从1开始 。
水平分库是一个极具挑战的项目 , 我们整个团队也在不断地迎接挑战中快速成长 。
【从零到千万用户,我是如何一步步优化MySQL数据库的?】为了适应公司业务的不断发展 , 除了在MySQL数据库上进行相应的架构升级外 , 我们还搭建了一套完整的大数据实时分析统计平台 , 在系统中对用户的行为进行实时分析 。