这个sql执行超过了2.5分钟,还有优化空间吗

【 TiDB 使用环境】生产环境
【 TiDB 版本】v7.1

SELECT
industry.NAME AS industry_name,
count( ‘’ ) AS count
FROM
company_f5
INNER JOIN patent_proposer_relation ON patent_proposer_relation.proposer_id = company_f5.id
INNER JOIN patent ON patent_proposer_relation.patent_id = patent.id
INNER JOIN patent_industry_relation ON patent_proposer_relation.patent_id = patent_industry_relation.patent_id
INNER JOIN industry ON industry.id = patent_industry_relation.industry_id
WHERE
patent.approval_date IS NOT NULL
AND patent.type = ‘发明’
AND industry.LEVEL = 0
AND industry.has_chain = ‘是’
AND industry.has_display = ‘展示’
AND company_f5.display = 1
AND company_f5.establish_date <= ‘2024-01-12’
AND company_f5.reg_province IN ( ‘北京市’ )
AND ( industry.industry_code LIKE ‘INA%’ OR industry.industry_code LIKE ‘INT%’ )
GROUP BY
industry.NAME
ORDER BY
count( '
’ ) DESC
LIMIT 15

这是执行的explain吧,执行explain analyze试试

company_f5、patent、patent_proposer_relation 这三个表都没有走索引么?

整个sql需要获取的列很少,一些条件少的表可以考虑索引覆盖,设计好索引应该还会快不少

explain analyze 从哪个版本开始支持,mysql8.0是才有

:flushed:tidb不是一直有么?

啊那我倒没注意~

还是把explain analyze 拉出来看看吧,从现有的预估执行计划上有一些表没用上索引,可能是没有。方便的话,可以把建表语句也拉出来看看。
例如:company_f5 表有三个条件,都没有用上索引。
AND company_f5.display = 1
AND company_f5.establish_date <= ‘2024-01-12’
AND company_f5.reg_province IN ( ‘北京市’ )

company_f5 预估扫描234960行,数据量还是不小的,如果通过索引能减少返回数据量,应该能提高速度。

翻了一下文档,确认了一下,确实从最早的v2.1就开始支持了

patent.approval_date IS NOT NULL这个条件致命。

可以发一下表结构和索引么?单纯看这个感觉主要是没有走索引导致的

SELECT
industry.NAME AS industry_name,
COUNT(‘’) AS count
FROM
industry
INNER JOIN patent_industry_relation ON industry.id = patent_industry_relation.industry_id
INNER JOIN patent_proposer_relation ON patent_industry_relation.patent_id = patent_proposer_relation.patent_id
INNER JOIN company_f5 ON patent_proposer_relation.proposer_id = company_f5.id
INNER JOIN patent ON patent_proposer_relation.patent_id = patent.id
WHERE
industry.LEVEL = 0
AND industry.has_chain = ‘是’
AND industry.has_display = ‘展示’
AND patent.approval_date IS NOT NULL
AND patent.type = ‘发明’
AND company_f5.display = 1
AND company_f5.reg_province = ‘北京市’
AND (industry.industry_code LIKE ‘INA%’ OR industry.industry_code LIKE ‘INT%’)
AND company_f5.establish_date <= ‘2024-01-12’
GROUP BY
industry.NAME
ORDER BY
count DESC
LIMIT 15;
试试这个

哇塞 :sunglasses:,TiDB还有多少功能在MySQL有之前就实现了

要看explain analyze

EXPLAIN ANAKYZE 你的SQL看下实际的执行计划,看下主要慢在哪一步,针对慢的那几步进行针对性的优化;还有一个看下company_f5、patent这两张大表为啥没有走索引,合理设置索引是否可以避免其全表扫描。

这些字段过滤性好吗,好的话加下索引

:yum:期待发现更多的彩蛋~

确实耗时太长,改变表结构适当添加部分索引、同时sql调优测试下

有索引

我的建议是直接所有的表都上tiflash