【 TiDB 使用环境】线上 【 TiDB 版本】 5.7.25-TiDB-v5.4.0 【遇到的问题】in 的子条件过多,大表 inner join 性能差 【复现路径】 a/b 两个表,数据量在千万级别,查询语句都带有租户索引,语句如下:
select count(distinct a.customerId) as count from a inner join b on a.customerId = b.id and a.company_id = b.company_id where a.company_id = 'uuid-1' and b.uids in ('1','2'......数量级在0-1000'');
【问题现象及影响】
集群复杂60%左右,查询该语句直接超时不返回,cpu飙升至90以上
前两天看到文档上提及了临时表,因此我做了一个实验:
CREATE TEMPORARY TABLE users (
id varchar(255) not null primary key
);
insert into users (id) values ('1','2' ....)
上述查询sql修改为:
select count(distinct a.customerId) as count from a inner join b on a.customerId = b.id and a.company_id = b.company_id where a.company_id = 'uuid-1'
and b.uids in (select id from users);
发现在1s返回了结果,
由于对临时表使用不熟悉,想请问一下大家这个场景下用临时表解决合不合适? 如果用临时表方案,在服务器运转的过程会创建很多张临时表,会不会对服务器有太大的压力?