MySQL查询时间太长,不明白为什么?



我使用MySQL,并且有一个查询,原则上应该是相当快的,但事实并非如此。在查询中,我使用了2个表,一个重14MB(称为b),另一个重106GB(是的,GB)(称为p和p2)。我尝试过滤尽可能多的内容,以便能够快速获取查询结果,但是这个查询无休止地运行了超过15分钟,直到我取消它。我希望你能帮我解决这个问题。这就是查询的样子:

SELECT b.code ,p2.result
FROM b_codes b
INNER JOIN pass p ON (b.id = p.id)
INNER JOIN pass p2 ON (b.s = p2.s AND b.tn = p2.tn AND p.t_ta = p2.t_ta AND p2.s = (p.s+1))
WHERE b.s <> ''
AND b.id <> 0
AND p2.date >= '2022-04-24 00:00:00' 
AND p2.date <= '2022-06-05 23:59:59'
AND b.j = 'Completed'
AND b.tn IN ('538')
GROUP BY b.code, b.id

我试图添加索引的使用,在p2中,我们对每个字段都有一个确切的索引,对于p的id索引也是如此,但问题似乎是在p2和group by的日期。我试着更改学期(中间)的日期,但也无济于事。我会很高兴得到你的帮助!

这是没有索引的EXPLAIN的结果:EXPLAIN on query WITHOUT INDEXES

第一行:b_codes,第二行:p,第三行:p2

这是对索引进行EXPLAIN查询的结果:

如果您已经有这些索引,请纠正我。你应该有这样的索引。它必须基于您在特定表/s中的where子句中使用的列

  1. [index_name]]

列常规

  • b.id
  • 研究
  • b.tn

[any_index_name]列/s

  • p2.date
b.id <> 0

可以改成b.id > 0吗?idPRIMARY KEY吗?是AUTO_INCREMENT吗?为什么会是"0"呢?

小表的建议索引(列的顺序很重要):

b_codes:  INDEX(j, tn, s, code, id)

请显示整个EXPLAIN。(文本优先于图像)

请提供SHOW CREATE TABLE。首先,idbidPRIMARY KEY吗?在了解更多信息之后,我将为更大的表提供索引建议。

另外,我还不知道是否要将其中一个测试更改为(p.s = p2.s-1)

最新更新