大表慢查询优化,索引优化。如何提高表查询效率?

【 TiDB 使用环境】生产环境
【 TiDB 版本】v5.4.2
【复现路径】用户通过系统查询业务,数据库响应慢。
【遇到的问题:问题现象及影响】
项目是一个saas系统,基本操作是每个表带一个租户ID区分。另外系统中的业务比较复杂,常用到多表join查询。
遇到问题:数据量在1亿左右的业务表,即使单表查询也很慢。通常客户查询1个月的单据就要个2-3秒左右。
例如:t1是销售单表,索引有时间、租户ID。
select column1,column2… from t1 where 时间 and 租户ID;
数据量少的租户没有问题,但当一个数据量超千万的租户去查询单据历史,上面的语句就会走租户ID索引,响应很慢。才1亿的数据,应该不至于啊。
已尝试过按时间或者租房ID做分区表了,效果不太好。而且个人觉得本身就是分布式数据库,为提高查询效率走分区表的方向对吗?
请教下各路大神都是怎么处理的?是否有其他的解决方案?
【资源配置】
【附件:截图/日志/监控】

有用tiflash吗?看了下文档,5.4貌似支持sum等聚合函数

没有tiflash,支持sum等聚合函数是啥意思?
另外,支持创建条件索引吗?类似pg的。

tiflash里有列存副本(表即为索引),你可以理解为列式数据库,对这种大表批量查询在性能上有巨大提升
https://docs.pingcap.com/zh/tidb/v5.4/tiflash-overview

根据查询做一个联合索引试试,不知道可行否

找个SQL 慢SQL执行计划 还有下面的信息贴出来

附图:

你贴的这个也不是: select column1,column2… from t1 where 时间 and 租户ID 这种SQL。 执行计划可以复制下文本,以便看后面信息。

看你这么多sum语句,建议直接上tiflash,绝对效果杠杠滴。

我贴的这个就是我举例的语句哦,
执行计划复制下文本我私发给你好吗?

tiflash一般上啥配置呢?几台机器 起?

这个得看你数据量大小,你可以先考量下你现在那些大表用tikv已经负载不了统计类SQL了,考虑承载下这些大表需要多少资源,我的建议是你先部署一个测试环境,把现在最大最慢的统计类SQL迁移部分数据过去,分别走tikv和tiflash看一下效率对比,看看要达到你的需求相对于现在的tikv节点需要多少tiflash节点。。。

3 个赞

你的磁盘是什么类型?

我不确定我的方法有没有效啊,做SQL优化归根结底就是三个思路,一个是空间换时间,一个是环境因素,我归纳如下方式:
1、建立数仓,如果用户有固定的需求,是否可以把数据表建模固化成报表,例如按月为周期的主题报表,这样查询的时候只要查这个报表即可。缺点是如果只是临时性突发性的需求,做报表意义不大。
2、增加redis缓存组件,把特定需求缓存下来,如果这种数据用的频次很高的话。
3、改为tiflash列数据库存储,考虑到你是针对column查询,我估计优化概率很大,你可以先在测试环境试试。
4、有没有可能形成数据倾斜?例如你分区分库,但是实际上表都存在有限的三四台服务器上,你看有没有数据运维工具查看一下。
5、资源干扰,你看看服务器的CPU/内存/网络,对比你执行查询前后的情况。如果你查询前的资源利用率(特别是内存)就很高了,那么可能是资源不足。。。

个人建议,当你发现问题,你最好做思维导图,然后用简单的二分法(正反面)三分法(左中右)进行穷举。数据管理问题,一般思维先于技术。

说明你索引还有优化空间啊,18万的索引读回表查询,已经算比较快了,把tdate也加到索引里面去就比较快了。

对tifalsh不是很了解,可以部分统计sql迁移过去。就是说要另外写业务代码查询吗?

ESSD云盘 11800 IOPS 单盘IOPS性能上限5万

tdate目前是单独索引。

disk performance 看下磁盘性能

建议很详细,且很多值得深思的地方。谢谢。