尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

【赵渝强老师】TiDB表数据与键值对的映射关系
📅 发布时间:2026/6/20 21:09:21

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

相关新闻

  • 音频升级指南:用Python轻松实现立体声到多声道的华丽蜕变
  • 苏州仓储服务哪家强?这三家企业绝对让你满意!
  • HuggingFace镜像网站国内加速源配置助力Anything-LLM快速启动

最新新闻

  • 如何用Ice拯救你的Mac菜单栏?3步打造极致整洁的工作空间
  • 盘点抖店主流上货工具:抖掌柜核心功能全解,商家高频疑问一次性解答(2026最新) - 抖掌柜
  • LPC213x I2C驱动开发:寄存器解析、状态机实战与调试指南
  • 智己LS6和问界M7怎么选?2026款值得买的深度对比与理性选购建议 - 外贸老黄
  • Agent 越能干,你越不敢放手?ANOLISA给它穿上全套防护
  • OpenWRT终极指南:iStore软件中心3大核心问题完整解决方案

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号