以下sql会有性能问题么,如何优化求建议

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:

【概述】 想读取tidb数据,做一些业务逻辑,test环境因为条数不够无法测出性能问题,但sql恐怕会在生产环境有性能问题,想请教专业人士指导
【背景】 假设表总条数有1亿条以上,其中有一个timestamp的字段,timestamp不是索引,通过timestamp读取200天以内的数据,如果200天内的总条数较多,比如共200万条,会在代码层分批读取,假设每批5000条。
sample: select * from {table_name} where timestamp > 1624181296458760881 and timestamp < 1624267696458760785 group by timestamp, user_id, user_time order by timestamp DESC limit 5000

【现象】 担心读取慢

【问题】 test环境因为数据较少没有问题,但是担心生产环境有读取慢的问题,请教影响会很大么?group by 对tidb读取性能影响如何?以及如果timestamp加上索引会有效果么?目前已经有其他字段索引

【业务影响】读取慢,导致tidb负载高,影响线上业务

【TiDB 版本】 TiDB-v4.0.9


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

2 个赞
  1. 潜在的影响就是随着数据量增加,可能在 TiKV 下推计算的资源消耗会更多;
  2. group by 对读性能是有一个排序的,所以资源有影响;
  3. 可以尝试在 timestamp 上面加一个索引,查询速度会有提升。
2 个赞

哦 谢谢 有什么更好的办法去重么 除了用group by

2 个赞

如果是去重,做分组排序就可以。需要保证 tikv 和 tidb 资源充足才可以哈。

2 个赞

因为限定了结果集最大是5000,因此对内存的消耗应该不大,而且也因为结果集限定了5000,而且是排序好的,对性能影响有限。

数据库不会把所有记录都排完序之后再取前5000条,而是限定了返回结果集最大为5000,比如已经有5000了,之后的记录就会和这5000排好序的记录进行比较,如果排在前5000之内,则会把原来排在5000的记录给挤掉,如果不排在5000之内,则直接丢弃这个新读取的记录,因此对TiKV的内存消耗最大就是这5000条记录的内存消耗,所以不用担心生产会出问题。

去重,也可以用DISTINCT