在这里插入图片描述

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。
视频讲解如下

【赵渝强老师】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数据库从零开始》

对于存在主键或者唯一约束的表,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

《TiDB数据库从零开始》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/93654.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/93654.shtml
英文地址,请注明出处:http://en.pswp.cn/web/93654.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

带操作系统的延时函数

delay.c:#include "delay.h"/*** brief 微秒级延时* param nus 延时时长,范围:0~233015* retval 无*/ void delay_us(uint32_t nus) {uint32_t ticks;uint32_t tcnt 0, told, tnow;uint32_t reload SysTick->LOAD; //重…

ES Module 和 CommonJS的区别

ES Module(ESM,ES6 模块系统)和 CommonJS 是 JavaScript 中两种主流的模块规范,分别用于现代前端和 Node.js 环境(早期),它们在语法、加载机制、特性等方面有显著区别。以下是详细对比&#xff…

猫头虎AI分享|一款智能量化交易系统:QuantCell,从数据收集到策略执行全流程自动化

猫头虎AI分享|一款智能量化交易系统:QuantCell,从数据收集到策略执行全流程自动化 在当今金融市场中,量化交易系统已经成为越来越多投资者和机构的重要选择。无论是股票、期货还是加密货币,自动化交易与人工智能的结合…

直播美颜SDK架构揭秘:动态贴纸功能的实现原理与性能优化

如今,美颜SDK 已经不再只是“磨皮、美白”的基础工具,而是逐渐进化为一个涵盖 人脸识别、实时特效、动态贴纸交互 的复杂技术体系。尤其是 动态贴纸功能 的加入,让主播与观众之间的互动更加生动有趣,也成为提升用户粘性与平台差异…

Docker安装CDC

Docker安装CDC拉取镜像离线形式安装上传文件并创建docker-compose.yml把镜像加载到docker中启动容器连接数据库创建账号,并给账号授权设置wal_level确认wal_level的值创建链接查询连接状态使用kafdrop消息中看不到修改之前的信息怎么办补充拉取镜像 docker pull co…

如何在win服务器中部署若依项目

一、安装jdk的环境: 这一步很简单,直接拿到安装包双击安装即可。 二、配置jdk的环境变量默认安装的路径为:C:\Program Files (x86)\Java\jdk1.7.0_51安装完成之后进行环境变量配置右击计算机(此电脑)点击属性点击高级系…

CSS从入门到精通完整指南

第一部分:CSS基础入门1.1 什么是CSSCSS(层叠样式表,Cascading Style Sheets)是用于描述HTML文档外观和格式的样式语言。CSS将内容与表现分离,让HTML专注于内容结构,CSS专注于视觉效果。1.2 CSS语法结构选择…

重温k8s基础概念知识系列二(Pod)

文章目录1、Pod概念2、K8s 中的 Pod 的两种用法3、定义Pod4、Pod的创建资源5、Pod 模板6、容器探针7、总结干货8、 K8s Pod 经典面试题速查表Pod是Kubernetes中最小的单元: 1、Pod概念 Pod 是可以在 Kubernetes中创建和管理的、最小的可部署的计算单元。它由一组、一…

设计模式之静态代理

一些个人理解 顾名思义,就是代理一个对象。 那么,既然要代理一个东西,就要传入它吧? 【1】所以将代理对象当作属性【【2】往往通过构造方法传入被代理的目标对象】。 既然要代理,那必然要和代理对象拥有相同的功能吧? 所以实现了…

牛津大学xDeepMind 自然语言处理(1)

牛津大学xDeepMind 自然语言处理 Natural Language Processing 词向量与词汇语义学 Word Vectors and Lexical Semantics 词语表示的基本问题与分布语义思想 传统词语表示(如独热向量)存在稀疏、正交、语义弱的问题,无法表达语义相似性。分布…

StarRocks数据库集群的完整部署流程

目录 依赖环境 下载安装包 部署FE 部署BE 搭建集群 停止集群 依赖环境 详见&#xff1a;StarRocks 部署&#xff1a;依赖环境-CSDN博客 下载安装包 在官方网站下载安装包&#xff1a;StarRocks 部署FE 创建元数据目录。 mkdir -p <meta_dir> 修改 FE 配置文件 f…

简单的 VSCode 设置

以下是我使用的vscode设置。虽然有些主观&#xff0c;但很实用。1 主题。我放弃了那些炫酷的主题。我选择了Tokyo Night (Storm)。理由是&#xff1a;它平静、赏心悦目&#xff0c;并且与代码形成了美丽的对比&#xff0c;却又不显得刺眼。2. 字体。我切换到了 JetBrains Mono …

Rust 条件语句

Rust 条件语句 在编程语言中&#xff0c;条件语句是程序流程控制的重要组成部分。Rust 作为一种系统编程语言&#xff0c;其条件语句的设计简洁而强大。本文将详细介绍 Rust 中的条件语句&#xff0c;包括其语法、用法以及一些高级特性。 1. 基本条件语句 Rust 中的基本条件语句…

【Java EE进阶 --- SpringBoot】初识Spring(创建SpringBoot项目)

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 &#xff0c;Java, Java EE初阶&#xff0c; Java数据结构 欢迎大家访问~ 创作不易&#xff0c;大佬们点赞鼓励…

脑潜在进展:基于潜扩散模型的三维脑磁共振成像个体时空疾病进展研究|文献速递-深度学习人工智能医疗图像

Title题目Brain Latent Progression: Individual-based spatiotemporal diseaseprogression on 3D Brain MRIs via latent diffusion脑潜在进展&#xff1a;基于潜扩散模型的三维脑磁共振成像个体时空疾病进展研究01文献速递介绍神经退行性疾病是现代医疗保健领域最紧迫的挑战之…

专题:2025AI技术应用与发展报告|附600+份报告PDF、数据仪表盘汇总下载

原文链接&#xff1a;https://tecdat.cn/?p43632 当企业管理者看着后台65%的任务被AI自动分配&#xff0c;却仍在为下周的营销方案熬夜改稿时&#xff0c;一个现实的矛盾浮出水面&#xff1a;AI到底能帮企业做什么&#xff1f; 2025年&#xff0c;算法研发投入占企业AI预算的…

【笔记】扩散模型(一一):Stable Diffusion XL 理论与实现

论文链接&#xff1a;SDXL: Improving Latent Diffusion Models for High-Resolution Image Synthesis 官方实现&#xff1a;Stability-AI/generative-models 非官方实现&#xff1a;huggingface/diffusers Stable Diffusion XL (SDXL) 是 Stablility AI 对 Stable Diffusion 进…

学习安卓APP开发,10年磨一剑,b4a/Android Studio

学习安卓APP开发 记得上次学APP都是在2016年前了&#xff0c;一晃就过去了10年。 当时用ANDROID studio打开一个空项目和编绎分别用了300秒&#xff0c;一下就用了10分钟。 后来买了一台一万多的电脑&#xff0c;CPU换成了I5 8600K 4.2GHZ*6核&#xff0c;再加上M2固态硬盘。 编…

调试技巧(vs2022 C语言)

调试之前首先要保证我们的脑袋是清晰的&#xff0c;我们调试的过程主要是看代码有没有按照我们的想法去运行调试最常使用的几个快捷键F5启动调试&#xff0c;经常用来直接跳到下一个断点处&#xff08;F5通常和F9配合使用&#xff0c;打了断点按F5程序可以直接运行到断点处&…

MySQL深度理解-Innodb底层原理

1.MySQL的内部组件结构大体来说&#xff0c;MySQL可以分为Server层和存储引擎层两部分。2.Server层Server层主要包括连接器、查询缓存、分析器、优化器和执行器等&#xff0c;涵盖MySQL的大多数核心服务功能&#xff0c;以及所有的内置函数&#xff08;如日期、时间、数据和加密…