索引写热点如何就解决

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:tidb 4.0
  • 【问题描述】: 1、有个大表,数据量在四千万,数据量还在不断增加,目前压测环境 2、存在热点索引 通过查看索引值 cola列 是varchar(30),并且值由大量的重复值,里面插入的是数值还有字符类型的数据 | 30024728173500010001 | | 30024728173500010001 | | 300247281777 | | 300247281777 | | 300247281777 | | 300247281777 | | 30024728177700010001 | | 30024728177700010001 | | 30024728177700010001 | | 300247281803 | ±---------------------+

3、通过查询表TIDB_HOT_REGIONS,这个索引有40个 热点写region

4、通过split region方式并没有解决热点块 pd-ctl -u http://172.18.1.3:2379 operator add split-region 2419158 --policy=approximate

5、官方文档通过这个方式拆分,但是列是字符类型的,存储的是数值类型或者字符类型,不知道如何拆分,而且存在很多重复的数据

SPLIT TABLE table_name [INDEX index_name] BETWEEN (lower_value) AND (upper_value) REGIONS region_num

问题,这个写热点如何解决

若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出打印结果,请务必全选并复制粘贴上传。

建表使用了参数 shard_row_id_bits=4 pre_split_regions =3,目前是索引存在大量热点

您好:
1. 已经确认是索引热点,需要split索引对吧? 那么可以参考这个文档。先按照字母尝试切分
split index
https://pingcap.com/docs-cn/stable/reference/sql/statements/split-region/#split-region-使用文档

就是因为看了文档,不知道split 怎么拆分,范围不好确认,大部分是数值,列的类型却是varchar 类型的,很少部分是HD9897873 类型的

在varchar里这不是数值,是字符串,不知道你们的这些值有没有规律,是否都是这么多位数,那么你也可以参考a-z,这样划分一下 30000xxx 3000001xx 3000002xx 之类的,看下是否可行。

image

大部分是以这个开头

还有小部分是这样的

我对拆分这块的疑问: 1、由于对region拆分原理不懂,如果index 按照 a-z 这种类型的拆分,,由于数据量分布不均匀,拆分后仍然有数据倾斜,某个段的数据仍然有很多,怎么处理

2、index拆分后,某一个段的region满了以后,会自动拆分成更多的region吧

  1. 那你就需要根据你的业务考虑是有其他更细的拆分方式了,这里是举个例子
  2. 会自动拆分

对于这种varchar 类型,但是里面是存放的数字的,而且一直是递增的值,索引热点如何解决,在现有有业务的情况下,我可以拆分一次,过半年,最后面哪个又变成热点,因为里面存放的数值一直递增,后期如何做

  1. 这个索引如果是单调递增的,并且持续并发写入那么应该集中到一个region上。
  2. 但是从你开始的答复可以看到,这个索引有40个 热点写region, 所以还是比较分散的。你应该可以按照递增的值把他们分散开, 并且以后新增的值也应该是预知的吧, 那么可以提取分散region,参考这个文档.

https://pingcap.com/docs-cn/stable/reference/best-practices/high-concurrency/#热点产生的实例

递增的号码,是由业务部门控制,对于数据量多少未知,无法做到未来1-2年从业务角度拆分索引

  1. 对于业务侧,可以考虑和业务侧多沟通。 如果不行,那么你可以考虑按照均匀分布,先来尝试划分。
  2. 对于当前的问题,可以先尝试打散后,是否能够解决。

1、如果只想了索引的拆分,有没有那个地方可以看出索引已经拆分,按照什么规则拆分;

2、如果在建表的时候,做索引的拆分,会预先拆分region出来,在建完表以后,表中进去大量数据后,再进行索引拆分,没有感觉,热点索引也没有减少,有没有什么地方可以观测的。

您好:
1. 拆分指定region,可以使用pd-ctl 中的命令将指定region一分为二,两种估算拆分
https://pingcap.com/docs-cn/stable/reference/tools/pd-control/#下载安装包

  1. 如果使用split 手工拆分,是按照您指定的值决定的
    https://pingcap.com/docs-cn/stable/reference/sql/statements/split-region/#split-region-使用文档

  2. 查看热点索引可以使用表 TIDB_HOT_REGIONS
    https://pingcap.com/docs-cn/stable/reference/system-databases/information-schema/#information-schema

  3. 对于热点问题, 您使用的4.0 还有 dashboard的key-vis功能,更加方便查询.

https://github.com/pingcap-incubator/tidb-in-action/blob/master/session3/chapter2/key-vis.md

这些都看过了,我的问题是split 索引后, split TABLE t INDEX idx 后,从哪里可以看到我是否已经做过索引的拆分, 就是索引拆分范围 2、如果通过对于已经拆分的索引( split TABLE t INDEX idx 后),发现效果不佳,如果删除这个split 索引的操作,表比较大,上亿的数据量了

  1. 使用show table regions 命令是否能满足您的要求? https://pingcap.com/docs-cn/stable/reference/sql/statements/show-table-regions/#show-table-regions
  2. 同mysql语法 https://pingcap.com/docs-cn/stable/reference/sql/statements/drop-index/#drop-index