请问tidb社区道友看得明白下面的描述吗?

请问tidb社区道友看得明白下面的描述吗?计算step,压根没看明白是怎么计算出来的?
tidb的官方文档是理科生写的。

【TiDB 使用环境】生产 均匀切分

索引均匀切分与行数据均匀切分的原理一样,只是计算 step 的值较为复杂,因为 index_value 可能不是整数。

upperlower 的值会先编码成 byte 数组,去掉 lowerupper byte 数组的最长公共前缀后,从 lowerupper 各取前 8 字节转成 uint64,再计算 step = (upper - lower)/num。计算出 step 后再将 step 编码成 byte 数组,添加到之前 upperlower的最长公共前缀后面组成一个 key 后去做切分。示例如下:

如果索引 idx 的列也是整数类型,可以用如下 SQL 语句切分索引数据:

SPLIT TABLE t INDEX idx BETWEEN (-9223372036854775808) AND (9223372036854775807) REGIONS 16;

该语句会把表 t 中 idx 索引数据 Region 从 minInt64maxInt64 之间均匀切割出 16 个 Region。

1 个赞

我一般问ai 太深的知识点,大多数人也不懂。
多用几种提问方式问。想学习也可以看下原理性的书籍。ai骗人不脸红

1 个赞

很精通之后可以再了解,看着就是想办法将索引值转换为int方便计算,现在知道索引怎么拆分就行,一般也不会人为计算这个值的吧。

1 个赞

可以问AI,可以解决大部分基础问题

加索引报 nil pointer dereference 可能是表结构有问题,建议用 ADMIN CHECK TABLE 检查一下。如果是大表加索引,推荐在业务低峰期操作,开启 INGEST 模式能减少对在线业务的影响。

1 个赞

索引均匀切分,就是先把索引值编码成二进制,去掉相同的开头,把剩下的前 8 字节变成数字,再按区间均分 step,最后把 step 拼回开头,生成切分点。

1 个赞

可以拿个整形的索引示例,写一下具体的计算方法吗?官方文档一笔带过,理科生写的文档就是一个字菜,让人着摸不透。

1 个赞

看不明白,可以问AI

我的理解是这样的,如果写的不对请大神指出
以下都是【编码后的索引 key 的字符数组】的逐字符十六进制视图
设lower是
0xAB CD 00 00 00 00 00 00 00 00 12 34
upper是
0xAB CD FF FF FF FF FF FF FF FF 56 78
那么最长公共前缀就是
0xAB CD
0xAB CD之后的uint64(8个字节)分别是0和八个0xFF
把0x0和0x一串F看成两个整数,均分成需要的份数,比如16份,那么就是
0x00 00…
0x10 00…
0x20 00…

0xF0 00…
把这些分别拼回最长公共前缀即0xAB CD上,那么切出来的就是
0xAB CD 10 00…
0xAB CD 20 00…

0xAB CD F0 00…

1 个赞

索引 step 本质是索引有效区间均分步长:先去掉索引 key 共用的表 / 索引 ID 前缀字节,剩余字节转 uint64 做除法算出 step,再拼回前缀生成分裂 key;整型索引只是刚好字节和数值一一对应,计算逻辑不变。

1 个赞

看不明白,太深奥

加索引报 nil pointer dereference 可能是表结构有问题,建议用 ADMIN CHECK TABLE 检查一下。如果是大表加索引,推荐在业务低峰期操作,开启 INGEST 模式能减少对在线业务的影响。

  • 编码:上下界lower/upper按 TiDB 规则转为字节数组;
  • 去前缀:剔除两数组最长公共前缀;
  • 转数字:剩余内容各取前 8 字节转为 uint64;
  • 算步长:分片数;
  • 拼 key:step 编码后拼接公共前缀,得到切分 key。

这是AI给的简答…

你看明白了吗?具体怎么计算呢?比如怎么转化为字节数组,怎么去前缀,怎么转数字。

这官方文档一笔带过,墨水都不留一笔,谁只问谁看得懂。

没看明白,这个是AI回答
针对字符串 / 非数字索引均匀切分,TiDB 靠二进制字节换算数值算步长 step:
把下限 lower、上限 upper 索引值转二进制字节数组
剔除两者一模一样的开头公共前缀(前缀不动,只变化后面差异段)
各自取差异部分前 8 字节,转成大整数 uint64
公式:step = (upper整数 - lower整数) / 要切分份数num
step 转回字节,拼回公共前缀,得到每一段切割 key

先剥离上下限编码后的公共前缀,各截取 8 字节转为 uint64 数值,用(上界数值-下界数值)/分片数算出 step,再拼接公共前缀与 step 编码生成分割键。 整数索引可直接用原生数值运算,无需字节编码转换,计算逻辑更简单。

切分索引比不切分对性能更好吗?

可以把它理解成“在编码后的有序数轴上等距取点”。例如去掉公共前缀后,lower/upper 前 8 字节对应数值 100 和 900,要切 4 个 Region,则 step=(900-100)/4=200,三个边界是 300、500、700;每个边界再编码并拼回公共前缀形成 split key。真实索引先经过 memcomparable 编码以保证字节序与索引顺序一致,所以这些数字通常不能直接当作原列值;整数示例由 TiDB 完成编码,16 个 Region 就是在 minInt64 到 maxInt64 的编码区间内取 15 个边界。

ai有时候不准