首先采用MySQL存储千亿级别的数据,确实是一项非常大的挑战。MySQL单表确实可以存储10亿级的数据,只是这个时候性能非常差,项目钟大量的实验证明,MySQL单表容量在500万左右,性能处于最佳状态。
针对大表的优化,主要是通过数据库分库分表来解决,目前比较普遍的方案有三个:分区、分库分表、NoSQL/NewSQL。实际项目中,这三种方案是结合的,目前绝大部分系统的核心数据都是以RDBMS存储为主,NoSQL/NewSQL存储为辅。
分区
首先来了解一下分区方案。
分区表是由多个相关的底层表实现的。这些底层表也是由句柄对象表示,所以我们可以直接访问各个分区,存储引擎管理分区的各个底层表和管理普通表一样(所有的底层表都必须使用相同的存储引擎),分区表的索引只是在各个底层表上各自加上一个相同的索引。这个方案对用户屏蔽了sharding的细节,即使查询条件没有sharding column,它也能正常工作(只是这个时候性能一般)。
不过它的缺点很明显:很多的资源都受到单机的限制,例如连接数、网络吞吐等。如何进行分区,在实际应用中是一个非常关键的要素之一。
下面开始举例:
以客户信息为例,客户数据量5000万+,项目背景要求保存客户的银行卡绑定关系,客户的证件绑定关系,以及客户绑定的业务信息。
此业务背景下,如何设计数据库呢?项目一期的时候,我们建立了一张客户业务绑定关系表,里面冗余了每一位客户绑定的业务信息。