关于TiDB写入性能

只是基于原理分析,暂时没有实际的环境。我在想一个问题,如果在同一个表
的数据按主键顺序写入的话,往每个region写数据时是不是会存在一段时间的单机
操作(因为都路由到同一个节点了,因为数据顺序,key也就是顺序的),要到98M
才分裂,分裂完,又是按顺序进行单机写。这样如何保证分布式写入性能呢??

如果没有特殊设置的话 递增型的写入是只写最后一个region,所以tidb有多种方式处理,如果主键是big int可以用auto_random替换auto_increment,如果是否非big int主键 可以用shard_row_id_bits打散,都不适用时可以考虑hash分区。 上面只是针对表,不使用索引,目前索引还没有好的打散方式,有个shard index限制比较多。相关内容可以 搜索关键字

1 个赞

表的打散分聚簇表和非聚簇表,如果是非聚簇的,主键就是自增字段,使用auto_random。如果是聚簇表,看主键类型,创建表的时候按规则打散,官方文档和课程里都有详细方法

我想我说的就是聚簇表的场景,如这一批数据写入
[1, “aaa”, 18] → key=t1_row1
[2, “aaa2”, 10] → key=t1_row2

[10000, “aaa10000”,1000] → key=t1_row10000

如果打散的话,想要范围查询,查500-600的数据那效率低了, 不打散的话,按上面提的疑问,这个就一直往一个region里写了。疑问主要在这里。

明白你得意思了。tidb相对于关系型数据库最大的优势是并发,所以按hash去打散,比范围的性能要好,查询下推到tikv是并发查询的,从多个tikv里查询出来结果,比一个tikv的查询出结果,是要快的,比如 500-600区间的直方图占比的数据很大,一个值就占用一个region,那么就会有100个region参与这次范围扫描,等于100个tikv(理想情况)参与扫描,是要比单个tikv要快的。 这个要跟关系型数据库的分区表区分开来

我这么理解是否正确?
其实这个并没有两全的方法
1)要么顺序数据写入一个region,这个写入没hash打散写入性能好。但这个
在范围查询时是由优势的
2)打散的方式写入,保证写入的性能,批量查询时,通过分布式并发的优势
来弥补缺少数据没集中在一起,需要多次查询的情况

是的 :raising_hand_man:

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。