集群有60亿左右的数据量,其中一张表20亿左右的数据,单次查询1000条数据,单台Ti-DB qps在1200左右,是否还有优化空间?

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

  • 【TiDB 版本】: 最新稳定版本, 4.0.8
  • 【问题描述】:
    在做储存选型,股票K线的使用场景:
    建表语句:
    CREATE TABLE kline_m1 (
    id bigint(32) NOT NULL COMMENT ‘主键ID’,
    tickerId bigint(11) NOT NULL COMMENT ‘tID’,
    tradeTime datetime NOT NULL COMMENT ‘交易时间’,

    status varchar(2) NOT NULL COMMENT ‘状态’,
    PRIMARY KEY (id),
    KEY tickerId_tradeTime (tickerId,tradeTime)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
    查询语句:
    SELECT id, tickerid, tradetime, …, status
    FROM kline_m1
    WHERE tickerid = ? AND tradetime < ?
    LIMIT ?

服务器配置: tidb: 16c64g,3台, tikv: 16c64g,3台, pd1台,如下图:

目前集群总的测试数据在60亿多点,其中的kline_m1表数据量20亿,从这张表查询,单次查询1000条数据,测试单台Ti-DB的qps在1200左右,

如果同时写入,

使用3台Ti-DB读写同时进行:【4台4c8g测试机,800线程写(插入),800线程读】

请问有谁有类似需求,一次需查询这么多条数的使用场景(如单次查询1000条数据),qps上是否还有提升的可能? 还是Ti-DB不适合这种股票K线的场景?还请大家指教。

  1. 麻烦上传下 explain analyze sql 的 信息
  2. 反馈压测时的 over-view, tidb, detail-tikv 监控信息,参考文档
    [FAQ] Grafana Metrics 页面的导出和导入


是这个么

IndexLookUp_18,1.82,root,“”,“limit embedded(offset:0, count:1000)”
├─Limit_17(Build),1.82,cop[tikv],“”,“offset:0, count:1000”
│ └─IndexRangeScan_15,1.82,cop[tikv],“table:kline_m1, index:tickerId_tradeTime(tickerId, tradeTime)”,“range:[920000007 -inf,920000007 2013-02-16 05:09:54], keep order:false”
└─TableRowIDScan_16(Probe),1.82,cop[tikv],table:kline_m1,“keep order:false, stats:pseudo”

如果我把日期范围控制在10天之内是不是会好些

我理解的是limit下推到了tikv,先执行limit,走indexRange,也只需要扫前面1000条,范围对sql执行影响不大,对么?

tidb-test-Overview_2020-11-18T07_09_49.922Z.json.zip (391.1 KB)

tidb-test-TiDB-Summary_2020-11-18T07_47_22.875Z.json.zip (211.4 KB)

tidb-test-TiKV-Summary_2020-11-18T07_48_35.414Z.json.zip (340.3 KB)

detail的导不出来

1、上述描述的场景及 SQL ,tidb 是支持的,看执行计划也是没有问题的
2、另外麻烦提供一下集群架构拓扑图,看上面的资源使用情况,只有 tidb-server 及 tikv unified pool cpu 较高,资源还没有完全使用起来,怀疑并发数不够
3、看上面的需求,可以考虑把 table 及 索引打散一下

谢谢,tidb的cpu已经太高了,生产上面可能用到12核就会考虑扩容了。是要dashboard里面的存储拓扑图么? 我理解的3台tikv,数据都存储在3台上,每台一个数据的rockdb,不知道您说的“把 table 及 索引打散一下”是怎么打散?是说我根据股票id分不同的表后,根据存储规则,单表的region数就会少很多,就会更加分散些? 但总体来说取1000条是避免不了的。查询100条时性能是可接受的。

1、不是分区表,是通过 split 命令把 可能出现的热点 region 进行拆分,然后充分利用多个节点上的资源,可以参考:https://docs.pingcap.com/zh/tidb/dev/sql-statement-split-region#split-region-的使用。另外建议看看官网上的《高并发写入场景最佳实践》
2、建议找一台配置稍微好点的服务器测试,其中 tidb-server 可以在一台服务器上部署2个,进行测试。另外,无论是 tidb 还是 tikv 都是可以通过扩容的方式来显著提高 QPS 的

谢谢!关于热点,每条sql查询条件的股票id是随机选的,热点应该是不存在,这里可以看到:

然后服务器配置,现在3台tidb是16c64g的,tikv也是3台16c64g,pd只有一台,监控pd也是没有压力。测试机是4台4c8g的。

ok,哪建议从 提高并发及扩容节点数量来提高 QPS,现在的瓶颈是资源上,不是数据库

ok ok

:muscle:有问题,可随时再开帖讨论