当前位置: 首页 > 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.rkmt.cn/news/109105.html

相关文章:

  • 音频升级指南:用Python轻松实现立体声到多声道的华丽蜕变
  • 苏州仓储服务哪家强?这三家企业绝对让你满意!
  • HuggingFace镜像网站国内加速源配置助力Anything-LLM快速启动
  • 成分好的蛋白粉排名 哪款更适合全家日常营养补充与中老年精准补给 - 资讯焦点
  • Windows on Arm运行PyTorch-DirectML体验
  • 南京美国留学中介机构排名前十名_10大排名推荐 - 留学品牌推荐官
  • 震惊!苏州仓储服务公司大比拼,究竟谁能称王?
  • 南京研究生留学机构最火的机构有哪些 - 留学品牌推荐官
  • MATLAB从零开始实现短时傅里叶变换STFT
  • 23、Linux 系统中的任务调度与数学计算实用指南
  • 修改chrome配置,关闭跨域校验
  • IDM激活脚本终极指南:轻松实现永久使用
  • IDM激活脚本终极指南:告别试用期烦恼,实现永久下载加速
  • Ivy统一AI框架:5步实现多框架代码无缝转换
  • Excalidraw多语言支持现状:中文界面设置方法
  • 智能体是什么?有什么作用?如何构建智能体?智能体涉及到哪些方面?
  • 照明系统设计
  • Socket.IO-Client-Swift完整开发指南:从零构建实时iOS应用
  • 如何通过‘语法配置’来‘解析SQL’代码
  • 29、网络文件系统(NFS)的锁管理与性能分析
  • 零工风险如何“防患于未然”?盖雅AI风控与四流合一体系深度解析
  • 职业迷茫与协议化服务助力发展
  • 建筑与装饰工程招标控制价编制——以蒲江县朝阳社区幼儿园为例(任务书)
  • 详解NVIDIA TensorRT层融合技术对吞吐量的提升效果
  • 换同义词真的没用!深扒知网AIGC检测原理,实测3款降ai率工具,谁能稳过检测?
  • 炸裂!从纯噪声到神级画作,只需几秒?扩散模型 + DALL·E 的黑魔法,全在这里揭秘了!
  • 如何在Ubuntu上安装PaddlePaddle并配置CUDA加速(附完整docker安装教程)
  • 2025年热门的精品礼盒印刷/包装礼盒印刷专业口碑排行榜 - 品牌宣传支持者
  • PaddlePaddle视觉套件PaddleDetection安装包获取与diskinfo下载官网替代方案
  • Excalidraw如何嵌入网页?Three.js开发者必看集成方案