【趙渝強老師】TiDB表數據與鍵值對的映射關系

在這里插入圖片描述

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;如日期、時間、數據和加密…