5G时代,如何彻底搞定海量数据库的设计与实践

简介:

5G时代,业务数据越来越丰富,业务使用MySQL数据库作为后台存储,存储引擎使用InnoDB,会带来哪些挑战?如何针对公司业务特点及MySQL数据库特性,制定若干数据库使用规范供一线RD在设计业务时参考部分内容要求强制执行。本文从介绍MySQL相关关键基础架构,并结合实际案例介绍表和索引的设计技巧,并对规范中重点内容做详细解读。

一、基础知识

1.1 InnoDB记录存储方式

大家都知道在InnoDB存储引擎中记录是按主键顺序存储,并且依靠这个特性为表创建了主键聚簇索引。

InnoDB是如何实现记录“顺序存储”的呢?首先要知道“顺序”分页内顺序和页间顺序,页为InnoDB内外存交换的基本单位。

页间顺序:磁盘文件中页与页之间使用双向链表连接,页间有可能是物理有序。大多数情况是逻辑上的有序;

页内顺序:页内各记录使用单项链表把记录连接起来,所以页内是逻辑有序,配合slot数据结构实现页内接近二分查找的查询效率。

图1 为InnoDB页内空间分布:

_1_InnoDB_

图1 InnoDB页内空间发布

根据以上特点,我们来分析下使用不同的主键对存储会造成哪些影响:

自增主键:主键值递增,数据是顺序插入的,所以在页内数据物理连续,写满一页后在顺序分配下一页。在没有删除操作的情况下,整个表的记录在磁盘文件中都是按照写入顺序连续存储的。其中存储方式磁盘利用率非常高,且随机IO很低。插入效率相当高。

业务主键:比如用户表使用“uid”做主键,商品表使用“infoId”做主键,这种有意义的主键,我们称为业务主键。很明显,业务主键不但无法做到记录物理连续而且在插入数据时还可能造成页的分裂,从而导致页内碎片,例如如果一个页空间已满,存储主键值0~99,100条数据,如果要插入55这条记录,页内已经放不下,需要分裂成两个页才能完成插入操作,而分裂后的两个页很难被写满,会造成页内碎片,所以业务主键在写入性能和磁盘利用率上都不如自增主键。

通过上面的分析,我们是不是可以得出结论:使用自增主键一定好呢?在我们分析完InnoDB的索引以前,现在下结论还有些早。

1.2 主键索引

InnoDB会自动在表的主键上创建索引,数据结构使用B+ Tree。根据存储上的特点主键索引也被称为聚簇索引。聚簇索引的索引结构和实际数据是存储在一起的,B+ Tree叶子节点存储的就是实际的记录,如图2所示:
_2_B_Tree_
图2 B+ Tree存储结构

1.3 非主键索引

既然记录存储在主键索引结构中,那么在其他列创建的索引是如何找到记录的呢?我们可以很自然的想到,非主键列上的索引可以先通过自身索引结构查找到主键值,然后在用主键值在聚簇索引上找到相应的记录。InnoDB就是这么做的,所以我们也称非主键列上的索引为二级索引(因为一次查询需要查找两个索引树)。

二级索引有以下特点:

1、除了主键索引以外的索引;

2、索引结构叶子节点中的Data是主键值;

3、一次查询需要查找自身和主键两个索引;

1.4 联合索引

联合索引也叫多列索引,索引结构的key包含多个字段,排序时先第一列比较,如果相同再按第二列比较,以此类推。联合索引结构图如图3所示:
_3_
图3 联合索引结构图

联合索引上的查询要满足以下特点:

1、key按照最左开始查找,否则无法使用索引;

2、跳过中间列,会导致后面的列不能使用索引;

3、某列使用范围查询时,后面的列不能使用索引。

根据前缀索引特性,联合索引(a,b,c),可以满足(a),(a,b),(a,b,c)三种查询。

二、小结

了解了InnoDB的索引后,我们再来分析自增主键和业务主键优缺点:

自增主键:写入、查询效率和磁盘利用率都高,但每次查询都需要两级索引,因为线上业务不会有直接使用主键列的查询。

业务主键:写入、查询效率和磁盘利用率都低,但可以使用一级索引,依赖覆盖索引的特性,某些情况下在非主键索引上也可以实现1次索引完成查询(后面的案例中会介绍)。

自增主键相对业务主键在IO效率上优势在SSD硬盘下几乎可以忽略,而在业务查询性能上业务主键有明显优势,所以在数据库中使用的都是业务主键。

三、业务表设计

针对MyQL数据库特性结合公司业务特点制定了一系列数据库使用规范,可以有效的指导一线RD在项目开发过程中数据库表和索引的设计工作。下面介绍业务中表和索引的重点设计原则以及两个实际案例。

3.1 表设计原则

主键选择:前面我们已经对比分析过业务主键和自增主键的优缺点,结论是业务主键更符合业务的查询需求,而互联网业务大多都符合读多写少的特性,所以所有线上业务都使用业务主键;

索引个数:由于过多的索引会造成索引文件过大,所以要求索引数不多于5个;

列类型选择:通常越小、越简单越好,例如:BOOL字段统一使用TINYINT,枚举字段统一使用TINYINT,交易金额统一使用LONG。因为BOOL和枚举类型使用TINYINT可以很方便的扩展,针对金额数据,虽然InnoDB提供了支持精确计算的DECIMAL类型,但DECIMAL是存储类型不是数据类型,不支持CPU原生计算,效率会低一些,所以我们简单处理将小数转为整数用LONG存储。

分表策略:首先要明确数据库出现性能问题一般在数据量到达一定程度后!所以要求我们提前做好预估,不要等需要拆分时再拆,一般把表的数据量控制在千万级别;常用分表策略有两种:按Key取模,读写均匀;按时间切分,冷热数据明确;

3.2 实际案例

案例一:用户表设计

用户表包含字段:uid,nickname,mobile,addr,image…..,switch;

uid为主键,业务上有按uid和mobile两种查询需求,所以要在moblie上创建索引。

switch列比较特殊,类型为BIGINT,用来保存用户的BOOL类型的属性,每一位可以保存用户的一个属性,例如我们用第一位保存是否接收推送,第二位保存是否保存离线消息等等。

这种设计有很高的扩展性(因为BIGINT有64位,可以保存64个状态,一般情况很难用满),但是同时也带来一些问题,switch有很高的查询频率。由于InnoDB是行存储,要找查询switch需要把正行数据取出来。

这对上述场景,我们可以表设计上可以做哪些优化呢?常用的方案是把表垂直查分,这种很常见我们不做过多讨论。

还有一种方案我们可以利用InnoDB覆盖索引的特性,在uid和switch两列上创建联合索引,这样在二级索引上包含uid和switch两列的值,这样用uid查询switch时,只通过二级所以就能找到switch,不需要访问记录,甚至不需要到二级索引的叶子节点就可以找到要查询的switch值,查询效率非常高。

另外有一点需要考虑,可以想象switch的变更也是相当频繁的,switch值得改变会导致联合索引的变更吗(这里的变更指索引节点分裂或顺序调整)?

答案是不会!因为联合索引的第一列uid是唯一且不会变的,所以uid就已经决定了索引的顺序,switch列的改变只会改变索引节点上第二个key的值,不会改变索引结构。

五、总结

1、 自增主键性能不一定高,需要结合实际业务场景做分析;

2、 大多数场景数据类型选择上尽量使用简单的类型;

3、 索引不是越多越好,太多的索引会导致过大的索引文件;

4、 如果要查询的数据可以在索引文件中找到,存储引擎就不会查找主键索引访问实际记录。

相关文章
|
缓存 算法 网络协议
面向5G的阿里自研标准化协议库XQUIC
XQUIC是阿里巴巴淘系架构团队自研的IETF QUIC标准化协议库实现,在手机淘宝上进行了广泛的应用,并在多个不同类型的业务场景下取得明显的效果提升,为手机淘宝APP的用户带来丝般顺滑的网络体验: 在RPC请求场景,网络耗时降低15% 在直播高峰期场景,卡顿率降低30%、秒开率提升2% 在短视频场景,卡顿率降低20%
4275 1
面向5G的阿里自研标准化协议库XQUIC
|
1月前
|
边缘计算 5G 数据处理
5G网络能耗管理:绿色通信的实践
【10月更文挑战第30天】
40 0
|
2月前
|
自动驾驶 物联网 5G
5G网络的演进:从理论到实践
【10月更文挑战第3天】5G网络作为新一代移动通信技术,不仅在理论上实现了重大突破,而且在实践中也展现出了强大的生命力。本文将围绕5G网络的演进,从理论基础到实际应用,探讨5G技术的发展和实践案例,同时提供代码示例以供参考。
160 6
|
2月前
|
物联网 5G 调度
|
存储 边缘计算 Kubernetes
阿里云高级技术专家李晓成:面向5G的云网一体及云原生应用实践
7月15日,阿里云高级技术专家李晓成在2020亚太内容分发大会上发表《面向5G的云网一体及云原生应用实践》主题演讲,从边缘计算产业机遇与挑战来解读阿里云边缘计算的布局,并分享阿里云在云网一体化、边缘云原生等领域的技术实践,本文为演讲原文。
2767 0
阿里云高级技术专家李晓成:面向5G的云网一体及云原生应用实践
|
5G 物联网 编解码
开放下载!独家解密文娱 5G+AI 时代的技术实践
从优酷窄宽高清革新布局,到大麦物联网的实践之路;从文娱内容认知的AI大脑,到交互式的6DoF视频技术。5G时代来临,阿里文娱如何用新技术开拓从制作、宣发到用户的全方位体验提升,这本书里给你答案!
18954 0
开放下载!独家解密文娱 5G+AI 时代的技术实践
|
开发者 机器人 流计算
开放下载!独家解密文娱 5G+AI 时代的技术实践 | 开发者必读(102期)
最炫的技术新知、最热门的大咖公开课、最有趣的开发者活动、最实用的工具干货,就在《开发者必读》!
722 0
|
Dart Serverless 5G
5G时代|闲鱼在Flutter&FaaS云端一体化架构的探索实践之路
随着无线,IoT 的发展, 5G 的到来,移动研发越发向多端化发展。传统的基于 Native+Web+ 服务端的开发方式研发效率低下,显然已经无法适应发展需要。本文将会介绍闲鱼近一年来在 Flutter&FaaS 一体化项目上的探索和实践。
1688 0
|
1月前
|
物联网 5G 智能硬件
介绍频段、带宽、频率、调制、解调等基础术语,以及Wi-Fi、蓝牙、ZigBee、UWB、LTE、5G等常见无线通信技术
在无线通信领域,专业术语是理解技术的关键。本文详细介绍了频段、带宽、频率、调制、解调等基础术语,以及Wi-Fi、蓝牙、ZigBee、UWB、LTE、5G等常见无线通信技术,还涵盖了信号传播、信道容量、信噪比等深入概念。通过本文,你将掌握无线技术的核心知识,成为半个无线专家。
70 4
|
1月前
|
传感器 监控 自动驾驶