当前位置: 首页 > news >正文

【赵渝强老师】TiDB表数据与键值对的映射关系

1

​TiDB实例将表中的每一行数据映射成RocksDB中的键值对,则需要考虑如何构造Key和Value。首先,OLTP场景下有大量针对单行或者多行的增、删、改、查等操作,要求数据库具备快速读取一行数据的能力。因此,对应的Key最好有一个唯一ID(显示或隐式的ID),以方便快速定位。其次,很多OLAP型查询需要进行全表扫描。如果能够将一个表中所有行的Key编码到一个区间内,就可以通过范围查询高效完成全表扫描的任务。

基于上述考虑,TiDB中的表数据与Key-Value的映射关系作了如下设计:

  1. 为了保证同一个表的数据放在一起,方便查找,TiDB会为每个表分配一个表ID,用TableID表示。表ID是一个整数,在整个集群内唯一。
  2. TiDB会为表中每行数据分配一个行ID,用RowID表示。行ID也是一个整数,在表内唯一。对于行ID,TiDB做了一个小优化,如果某个表有整数型的主键,TiDB会使用主键的值当做这一行数据的行ID。
image.png
点击这里查看视频讲解:【赵渝强老师】TiDB表数据与键值对的映射关系

每行数据按照如下规则编码成(Key,Value)键值对:

Key:tablePrefix{TableID}_recordPrefixSep{RowID}
Value:[col1,col2,col3,col4]# 提示:通过查询information_schema.tables可以获取到TableID,例如:
tidb> select tidb_table_id from tables where table_name='DEPT';
+---------------+
| TIDB_TABLE_ID |
+---------------+
|           121 |
+---------------+

对于存在主键或者唯一约束的表,TiDB将会使用主键或者唯一约束条件作为RowID;而对于不存在主键或者唯一约束的表,TiDB将会表自动生成_tidb_rowid。下面是一个简单的示例。

(1)当表有主键的时候是没有这个_tidb_rowid列

tidb> create table table1(id int primary key,name char(30));
tidb> insert into table1 values(1,'AAA');
tidb> select _tidb_rowid from table1;
ERROR 1054 (42S22): Unknown column '_tidb_rowid' in 'field list'

(2)当表不存在主键时,TiDB会自动创建_tidb_rowid且该列初始值是1,递增也是1。

tidb> create table table2(id int,name char(30));
tidb> insert into table2 values(1,'AAA'),(2,'BBB'),(3,'CCC');
tidb> select _tidb_rowid,id,name from table2;
+-------------+------+------+
| _tidb_rowid | id   | name |
+-------------+------+------+
|           1 |    1 | AAA  |
|           2 |    2 | BBB  |
|           3 |    3 | CCC  |
+-------------+------+------+
3 rows in set (0.020 sec)

下面通过一个简单的例子,来理解TiDB的Key-Value映射关系。假设TiDB中有如下这个表:

tidb> create table user (id int,name varchar(20),role varchar(20),age int,primary key (id),key idxage (age)
);# 假设该表中有3行数据:
1, "TiDB",	"SQL Layer",	10
2, "TiKV",	"KV Engine",	20
3, "PD", 	"Manager",		30

首先每行数据都会映射为一个(Key,Value)键值对,同时该表有一个int类型的主键,所以RowID的值即为该主键的值。假设该表的TableID为10,则其存储在TiKV上的表数据为:

t10_r1 --> ["TiDB", "SQL Layer", 10]
t10_r2 --> ["TiKV", "KV Engine", 20]
t10_r3 --> ["PD", "Manager", 30]

除了主键外,该表还有一个非唯一的普通二级索引idxAge,假设这个索引的IndexID为1,则其存储在TiKV上的索引数据为:

t10_i1_10_1 --> null
t10_i1_20_2 --> null
t10_i1_30_3 --> null
http://www.jsqmd.com/news/98465/

相关文章:

  • 音频升级指南:用Python轻松实现立体声到多声道的华丽蜕变
  • 【赵渝强老师】TiDB的底层存储机制
  • 高科战神慧知联
  • 苏州仓储服务哪家强?这三家企业绝对让你满意!
  • 南京留学 top10 机构推荐谁 - 留学品牌推荐官
  • 基于微信小程序的广西壮锦文化传播与线上销售系统的设计与实现(源码+lw+部署文档+讲解等)
  • HuggingFace镜像网站国内加速源配置助力Anything-LLM快速启动
  • Windows on Arm运行PyTorch-DirectML体验
  • 7、游戏开发:从基础搭建到动画实现
  • 成分好的蛋白粉排名 哪款更适合全家日常营养补充与中老年精准补给 - 资讯焦点
  • 南京美国留学中介机构排名前十名_10大排名推荐 - 留学品牌推荐官
  • 41、深入解析文件系统:fsflush 与 UFS 的奥秘
  • 专业的GEO服务商有哪些?国内主流AI优化服务提供商综合解析 - 深度智识库
  • 3大核心技术解析:Lottie-Android多色渐变动画深度实战
  • 8、美化游戏:从动画到精灵表的全面优化
  • 震惊!苏州仓储服务公司大比拼,究竟谁能称王?
  • Wan2.2-I2V-A14B实战避坑指南:从零搭建高效视频生成环境
  • 竞品分析已变,AI平台盘点
  • 南京十大排名好的新加坡留学中介机构名单榜首哪个好 - 留学品牌推荐官
  • 9、游戏逻辑添加与船只类扩展
  • LangFlow工作流引擎在多模态大模型中的调度作用
  • 2025 AI营销利器:顶级消费者洞察与AI市场舆情分析平台榜单
  • LangFlow构建Markdown编辑器插件,增强写作智能化
  • 南京研究生留学机构最火的机构有哪些 - 留学品牌推荐官
  • 20、Linux 磁盘存储与打印操作全解析
  • 39、GNOME 开发相关知识与资源全解析
  • AI市场舆情分析与量化风险:超越预测的2025年AI决策之道
  • PaddlePaddle静态图模式应用:结合git版本控制管理模型迭代
  • 23、Linux 系统中的任务调度与数学计算实用指南
  • 2025年比较好的恩施装修承包装修质量榜 - 品牌宣传支持者