文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

搞定万亿级MySQL海量存储的索引与分表设计实战

2024-12-03 12:47

关注

一、什么是InnoDB记录存储方式?

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

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

图为InnoDB页内空间分布:

 

Page Header

 

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

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

二、什么是主键索引?

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

 

聚簇索引

 

三、什么是非主键索引?

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

二级索引有以下特点:

四、什么是联合索引?

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

 

联合索引

 

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

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

五、小结

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

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

六、电商业务分表设计与实践

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

1、表设计原则

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的值,不会改变索引结构。

案例二:IM子系统分表方案

IM子系统包含:用户、联系人、云消息、系统消息四个主要的业务表。数据库按业务拆分,每个业务使用单独的实例。除系统消息表外,其他表都是以uid做key按128取模分了128个表。由于系统消息的业务比较特殊,所以其分表方案与其他业务不太一样。

我们先来了解下系统消息的业务特点:系统消息表保存的是服务器发出通知类型的消息,既然是通知,就会有实效性,我们规定系统消息有效期为30天,所以针对以上特点我们采取如下分表方案:

大家思考一个问题:查询一个人的系统消息时,由于是按月分表,而大多数查询都是跨月的(因为需要查找30天内的消息),所以需要两次数据库交互。是否可以优化呢?

我们可以冗余存储,具体优化方案如下:

 

冗余存储方式

 

这个方案我们可以保证一次查询可以找到用户所有有效期内的系统消息,但是通过牺牲了存储空间和写入效率换取的,不一定是最优的方案,但在总数据量不大,且比较注重查询性能的业务场景下还是可以选用的。

七、总结

 

来源:架构之美内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯