tidb v6.1 支持对热点二级索引 tidb_shard,有几个问题:
1)pr 列表( https://github.com/pingcap/tidb/pull/30659/files#diff-666d1a84ae8739fed6db8ee5c795f3c01287a44b0455f4d0d00bc5c0d7b5cbc4)里面只看到是如何支持 select 的,但是 insert 如何支持的?即 index (tidb_shard(a), a) 中的前缀 tidb_shard(a) 需要拼接在 a 前面存储到tikv吗?如果不需要,是如何实现打散写热点的?
2)目前shard index 的有很多限制(https://github.com/pingcap/tidb/blob/master/docs/design/2022-01-04-integer-shard-index.md),cockroachdb 也实现了 shard-index (https://www.cockroachlabs.com/docs/stable/hash-sharded-indexes.html),但是几乎没什么限制。tidb 有参考 cockroachDB吗?后续有继续改进计划吗?
- 是的,作为前导列起打散作用,如下格式:
Key: tablePrefix{tableID}_indexPrefixSep{indexID}_indexedColumnsValue Value: rowID
- 目前没翻到后续优化计划? 想问下这个的目的是,什么具体的 case?
https://github.com/pingcap/tidb/issues/18619 Support hash-sharded INDEX for sequential column like time
目前shard index 限制太多,只能支持 等值查询,不支持 范围查询等等,这个功能在业务应用上有些鸡肋。
https://docs.pingcap.com/zh/tidb/dev/tidb-functions#语法图-3
这里列举的限制:
- 非等值查询无法使用索引。
- 查询条件中
AND
和OR
混合且最外层是AND
算子时无法使用 SHARD INDEX。 -
GROUP BY
无法使用 SHARD INDEX。 -
ORDER BY
无法使用 SHARD INDEX。 -
ON
子句无法使用 SHARD INDEX。 -
WHERE
子查询无法使用 SHARD INDEX。 - SHARD INDEX 只能打散整型字段的唯一索引。
- SHARD INDEX 联合索引可能失效。
- SHARD INDEX 无法走 FastPlan 流程,影响优化器性能。
- SHARD INDEX 无法使用执行计划缓存。
还有一些限制:只支持唯一索引,且支持 int 类型的输入
感觉 using hash with bucket = N 这种方式挺好的,tidb 用 uk((tidb_shard(a)),a) 这种方式挺奇怪的,不支持指定 bucket数目。
暂时没有计划去掉这些限制,请关注 roadmap 和 release note。