海量数据存储探索| 青训营笔记

112 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第二篇笔记

一、前言

由于我们小组项目选择了搜索引擎,涉及到一亿数据量的存储,因此需要考虑如果存储这海量数据。

二、MySQL测试

平时MySQL使用得比较多,因此先考虑使用MySQL的方案,单表插入五百万数据,花了两个多小时

image.png

进行查询,走索引0.03s左右

image.png

不走索引,全表扫描2s多

image.png

三、分表问题

对于关系型数据库MySQL来说,存储1亿数据想要提升性能就得分库分表了,而分库分表主要会带来以下问题:

1、ID问题:自增主键可能重复、用完等,分库分表需要有一个全局唯一ID来标识一条数据,即分布式ID

2、事务问题:分库分表后就成了分布式事务了。如果依赖数据库本身的分布式事务管理功能去执行事务,将付出高昂的性能代价; 如果由应用程序去形成程序逻辑上的事务,又会造成编程方面的负担

3、跨库join、count、聚合、排序等问题

针对项目需求,主要解决id问题,可采取的方案有:

  • 基于UUID:UUID有着全球唯一的特性。但不具备趋势自增特性,主键过长
  • 基于Mysql自增ID:需要一个ID的时候,向表中插入一条记录返回主键ID。但访问量激增时MySQL本身就是系统的瓶颈
  • 基于Mysql集群:多个数据库分步生成ID。但难以扩容
  • 基于Mysql号段:从数据库选出一个号段范围批量获取自增ID。采用版本号version乐观锁方式更新
  • 基于Redis:利用redis的incr命令实现ID的原子性自增。需考虑redis持久化的问题
  • 基于雪花算法(Snowflake):Long类型的ID,占8个字节

后续:项目没有采用MySQL方案,用到了雪花算法生成唯一id,不过探索的过程中也学习到不少知识。