MySQL · 特性介绍 · 一些流行引擎存储格式简介

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: 概述本文简要介绍了一些存储引擎存储结构,包括InnoDB, TokuDB, RocksDB, TiDB, CockroachDB, 供大家对比分析InnoDBInnoDB 底层存储结构为B+树,结构如下 B树的每个节点对应innodb的一个page,page大小是固定的,一般设为16k。其中非叶子节点只有键值,叶子节点包含完整数据。 InnoDB按segment, exte

概述

本文简要介绍了一些存储引擎存储结构,包括InnoDB, TokuDB, RocksDB, TiDB, CockroachDB, 供大家对比分析

InnoDB

InnoDB 底层存储结构为B+树,结构如下
image.png

B树的每个节点对应innodb的一个page,page大小是固定的,一般设为16k。
其中非叶子节点只有键值,叶子节点包含完整数据。
InnoDB按segment, extent, page方式管理page
image.png

每个数据节点page结构如下
image.png

数据记录record按行存储,record具体格式由row_format决定.
详情可以参考数据内核月报

TokuDB

TokuDB 底层存储结构为Fractal Tree
屏幕快照 2017-10-16 下午2.38.11.png

Fractal Tree的结构与B+树有些类似, 在Fractal Tree中,每一个child指针除了需要指向一个child节点外,还会带有一个Message Buffer ,这个Message Buffer 是一个FIFO的队列,用来缓存更新操作。

例如,一次插入操作只需要落在某节点的Message Buffer就可以马上返回了,并不需要搜索到叶子节点。这些缓存的更新会在查询时或后台异步合并应用到对应的节点中。

RocksDB

RockDB的存储结构如下
xx.png

RocksDB写入数据时,先写到memtable中,memtable一般为skiplist, memtable写满时转为immutable memtable并刷入Level 0.

Level0中的SST文件中的数据都是有序的,Level0中SST文件之间的数据范围可能存在重叠。
其他Level中的SST文件之间的数据范围不重叠。

RocksDB会以一定的机制从低level compact数据到高level中。

RocksDB中SST文件的结构如下
image.png

MyRocks使用的存储引擎就是RocksDB, MyRocks的中RocksDB的数据映射关系参考 之前的月报
image.png

TiDB

TiDB的存储结构

image.png

TiDB是分布式存储,分为两个部分TiKV和Placement Driver server。
TiKV用于存储真正的数据,TiKV由分布在不同机器上的RocksDB实例组成。
数据按范围划分为一个个Region. 并且会尽量保持每个 Region 中保存的数据不超过一定的大小(这个大小可以配置,目前默认是 64MB). 同一Region分布在不同的RocksDB实例中,一个RocksDB实例包含多个Region.
图中,Region4有三个副本分布在三个RocksDB实例中,这三个Region副本组成一个RaftGroup,副本间通过Raft协议保证一致性。
Placement Driver server(PD), 也是一个集群,也通过Raft协议保证一致性。PD主要有以下作用:

  • 存储region的位置等元数据信息
  • 调度和rebalance regions, TiKV中的Raft leader等信息
  • 分配全局事务ID

TiDB的数据映射关系
以下表为例

create table user(user_id int primary key, name varchar(100), email varchar(200));
INSERT INTO user VALUES (1, “bob”, “huang@pingcap.com”);
INSERT INTO user VALUES (2, “tom”, “tom@pingcap.com”);
AI 代码解读

对应到RocksDB中的KV结构如下

Key Values
user/1 bob huang@pingcap.com
user/2 tom tom@pingcap.com

CockroachDB

CockroachDB的存储结构

image.png

image.png

CockroachDB的也是分布式存储,其结构和TiDB类似。CockroachDB按范围划分为Range,Range默认为64M,Range的存储为RocksDB, CockroachDB的一个node包含多个RocksDB实例。
Range副本分布在不同的node中,通过Raft协议保证一致。

Range的元数据信息也保存在Range中(靠前的Range中).

System keys come in several subtypes:

  • Global keys store cluster-wide data such as the “meta1” and “meta2” keys as well as various other system-wide keys such as the node and store ID allocators.
  • Store local keys are used for unreplicated store metadata (e.g. the StoreIdent structure). “Unreplicated” indicates that these values are not replicated across multiple stores because the data they hold is tied to the lifetime of the store they are present on.
  • Range local keys store range metadata that is associated with a global key. Range local keys have a special prefix followed by a global key and a special suffix. For example, transaction records are range local keys which look like: \x01k txn- .
  • Replicated Range ID local keys store range metadata that is present on all of the replicas for a range. These keys are updated via Raft operations. Examples include the range lease state and abort cache entries.
  • Unreplicated Range ID local keys store range metadata that is local to a replica. The primary examples of such keys are the Raft state and Raft log.

CockroachDB的数据映射关系

以下表为例

create table mydb.customers(name varchar(100) primary key, address varchar(100) , URL varchar(100));
insert into mydb.customers values('Apple','1 Infinite Loop, Cupertino, CA','http://apple.com/');
AI 代码解读

表结构信息

Key Values
/system/databases/mydb/id 51
/system/tables/customer/id 42
/system/desc/51/42/address 69
/system/desc/51/42/url 66

表中的数据

Key Values
/51/42/Apple/69 1 Infinite Loop, Cupertino, CA
/51/42/Apple/66 http://apple.com/

最后

本文简要介绍了各存储引擎的结构,供大家参考,有错误之处请指正.

参考文档

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
db匠
+关注
目录
打赏
0
0
0
0
9495
分享
相关文章
SpringBoor连接mysql数据库取数据库中时间格式是12小时制的时间,如何显示成24小时制
SpringBoor连接mysql数据库取数据库中时间格式是12小时制的时间,如何显示成24小时制
112 0
【MySQL进阶-08】深入理解innodb存储格式,双写机制,buffer pool底层结构和淘汰策略
【MySQL进阶-08】深入理解innodb存储格式,双写机制,buffer pool底层结构和淘汰策略
887 0
Mysql行格式DYNAMIC和COMPACT区别
总之,选择哪种行格式取决于具体的应用场景,如数据类型分布、读写比例、存储与性能需求等。在处理大量文本或二进制数据且对存储空间敏感的应用中,DYNAMIC格式可能是更好的选择;而对于混合型数据且对读取性能有一定要求的场景,COMPACT格式可能更合适。在设计数据库时,评估这些因素并进行适当测试,可以帮助确定最适合的行格式。
351 0
mysql百分数转小数点格式
在MySQL中,将百分数转换为小数点格式是一个简单直接的操作,可以通过基本的数学表达式和函数实现。无论是处理以字符串形式存储的百分数值,还是直接以数值形式表示的百分比,都可以通过适当的转换查询轻松实现这一目标。通过理解和应用这些基本的转换方法,可以有效地处理和分析数据库中的百分比数据。
113 5
【MySQL技术内幕】4.2-InnoDB行记录格式
【MySQL技术内幕】4.2-InnoDB行记录格式
125 0
MySQL记录删除后竟能按中间被删除的主键加回去,磁盘空间被重用!——底层揭秘MySQL行格式记录头信息
当Mysql记录被删除,页中记录存储结构如何变化?当删除的记录再次被插入,页中记录存储结构如何变化?本篇讲解记录头信息的底层原理和计算,让你从原理理解它!
169 0
MySQL记录删除后竟能按中间被删除的主键加回去,磁盘空间被重用!——底层揭秘MySQL行格式记录头信息
mysql数据库处理TIMESTAMP格式日期
该内容提到了关于MySQL数据库处理TIMESTAMP格式日期的解决方案。首先,引用了两篇CSDN博客文章,一篇是关于使用MyBatis在MySQL中添加或修改TIMESTAMP日期的,另一篇是关于将Oracle的TIMESTAMP字段通过MyBatis插入到数据库的。接着,提到一个错误信息,说明MySQL表中不能有多个TIMESTAMP列。然后,展示了如何设置数据库字段(ctime和mtime)自动记录创建和更新时间,并提供了对应的mapper文件和Java字段定义,以实现业务代码中无需手动设置这些时间戳。
157 2
Python MySQL操作实战教程(1):查询并数据JSON格式
Python MySQL操作实战教程(1):查询并数据JSON格式
629 0
Windows下的mysql字符集格式修改
在Windows上的MySQL 5.7.17,若安装时未设置字符集,可能导致乱码问题。本文提供了解决方案:首先,通过`mysql -uroot -p`登录并使用`show variables like '%char%';`查看当前字符集。然后,有两种修改方法:一是使用Shell命令临时修改9个相关属性为utf8;二是永久修改,在my.ini配置文件中将[mysqld]、[client]、[mysql]下的字符集改为utf8。记得重启MySQL服务以应用更改。此外,还提供了修改数据库和表字符集的SQL命令。

相关产品

  • 云数据库 RDS MySQL 版
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等