TiDB如何将行记录映射为键值对

在TiDB中,行记录被映射为键值对(Key-Value,KV)的过程涉及到几个关键步骤。以下是详细的解释:

1. 表数据与Key-Value的映射关系

TiDB为每个表分配一个唯一的表ID(TableID),并为表中的每行数据分配一个行ID(RowID)。如果表有整数型的主键,TiDB会使用主键值作为行ID。行数据按照以下规则编码成键值对:

  • KeytablePrefix{TableID}_recordPrefixSep{RowID}
  • Value[col1, col2, col3, col4]

其中,tablePrefixrecordPrefixSep是特定的字符串常量,用于在Key空间内区分其他数据。

2. 索引数据与Key-Value的映射关系

TiDB支持主键和二级索引(包括唯一索引和非唯一索引)。为每个索引分配一个索引ID(IndexID)。索引数据按照以下规则编码成键值对:

  • 主键和唯一索引

    • KeytablePrefix{tableID}_indexPrefixSep{indexID}_indexedColumnsValue
    • ValueRowID
  • 非唯一索引

    • KeytablePrefix{TableID}_indexPrefixSep{IndexID}_indexedColumnsValue_{RowID}
    • Valuenull

3. 示例说明

假设在TiDB中有一个名为User的表,包含ID(主键)、NameRoleAge四个列。表中有以下三行数据:

IDNameRoleAge
1"TiDB""SQL Layer"10
2"TiKV""KV Engine"20
3"PD""Manager"30

假设该表的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

4. 总结

通过这种映射方式,TiDB能够将关系型数据库中的表数据和索引数据有效地转换为键值对,从而利用分布式键值存储系统(如TiKV)的优势进行数据存储和检索。这种设计使得TiDB能够在保持关系型数据库的功能和性能的同时,实现水平扩展和高可用性

03-20
### TiDB 和 Groovy 中 `LEFT` 的使用 在数据库查询语言以及编程语言中,`LEFT` 可能被用于不同的上下文中。以下是关于 `LEFT` 函数或操作符的具体说明。 #### 1. **TiDB/MySQL 中的 `LEFT` 函数** 在 TiDB 和 MySQL 中,`LEFT` 是一种字符串处理函数,其语法如下: ```sql LEFT(str, length) ``` - `str`: 输入的字符串。 - `length`: 返回子串的长度(字符数)。如果 `length` 大于字符串的实际长度,则返回整个字符串;如果为负值,则返回空字符串。 此函数的作用是从字符串开头提取指定数量的字符[^1]。 ##### 示例: 假设有一个表 `example_table`,其中有一列名为 `name`,存储了一些名字数据。 | name | |------------| | Alexander | | Benjamin | 可以运行以下 SQL 查询来获取每行前三个字母: ```sql SELECT LEFT(name, 3) AS short_name FROM example_table; ``` 结果将是: | short_name | |------------| | Ale | | Ben | --- #### 2. **Groovy 中的操作符重载与 `LEFT` 类似的行为** 虽然 Groovy 并未定义严格意义上的 `LEFT` 操作符,但在某些场景下可以通过集合或其他结构实现类似的逻辑。例如,在 Groovy 的 Map 集合中,“<<” 操作符可用于向现有映射添加新键值对[^3]。 下面是一个简单的例子展示如何扩展一个 Map 对象的内容: ```groovy def map = ['J': 'Java', 'K': 'Kotlin'] map << ['G': 'Groovy'] // 使用 "<<" 添加新的条目 println(map) // 输出: [J:Java, K:Kotlin, G:Groovy] // 如果想模拟 “取左部分”,可手动截断 Map 键值对 def leftPart = map.take(2) println(leftPart) // 输出: [J:Java, K:Kotlin] ``` 这里通过 `.take(n)` 方法实现了类似于保留左边 n 条记录的效果[^4]。 --- #### 总结 对于 TiDB 或 MySQL 用户来说,可以直接利用内置的 `LEFT()` 函数完成字符串切片任务。而在像 Groovy 这样的动态脚本语言里,尽管不存在直接对应的 `LEFT` 关键字或者运算符,但借助其他工具和技术同样能够达成相近目的。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值