我使用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子句中使用的列
- [index_name]]
列常规
- b.id
- 研究
- b.tn
[any_index_name]列/s
- p2.date
b.id <> 0
可以改成b.id > 0
吗?id
是PRIMARY KEY
吗?是AUTO_INCREMENT
吗?为什么会是"0"呢?
小表的建议索引(列的顺序很重要):
b_codes: INDEX(j, tn, s, code, id)
请显示整个EXPLAIN
。(文本优先于图像)
请提供SHOW CREATE TABLE
。首先,id
是b
或id
的PRIMARY KEY
吗?在了解更多信息之后,我将为更大的表提供索引建议。
另外,我还不知道是否要将其中一个测试更改为(p.s = p2.s-1)