加速超时的MySQL查询

加速超时的MySQL查询

问题描述:

我试图从多个表中获取数据,这些数据需要合并在一起进行报告。我正在尝试获取每个在特定日期后完成的每个标题的所有详细信息,并且必须检查由于不良数据而导致的0日期。加速超时的MySQL查询

我正在使用遗留表格,我很遗憾地没有创建并且无法更改。此声明在我的应用程序中超时,并且需要大约40秒才能在本地虚拟机上运行数据库。是否有可能重构查询以获得更好的性能?任何帮助表示赞赏!

SELECT detail.* 
FROM detail 
JOIN header 
    ON detail.invoice = header.invoice 
WHERE detail.dateapply != '0000-00-00' 
    AND header.dateapply >= '2017-09-17' 
    AND header.orderstatus IN ('complete', 'backorder') 
ORDER BY detail.DateApply;` 
+0

'dateapply'是什么字段类型? – JNevill

+2

你有索引on dateapply和orderstatus? – sskoko

+0

理想的事情是为正在连接和过滤的表添加适当的索引。但是既然你不能改变桌子......我猜测你运气不好?除非添加索引不计算为“无法更改” – knittl

对于header

INDEX(orderstatus, dateapply) 
INDEX(invoice, orderstatus, dateapply) 

对于detail

INDEX(invoice, dateapply) 
INDEX(dateapply, invoice) 

列的顺序是经过深思熟虑的。由于我无法确定优化器将从哪个表开始,因此我提供的索引应该是最优的。

如果两个dateapply列同步,那么可能会进一步优化。

在我的同事和我之间,我们想出了下面的查询,它可以更快地返回结果。 GROUP BY消除了重复的记录。我想感谢大家花时间帮助我看看我的问题,并期待将来能够使用索引。

SELECT d.* 
FROM detail d 
JOIN header h 
    ON d.invoice = h.invoice 
WHERE d.qbposted = 0 
    AND d.dateapply != '0000-00-00' 
    AND h.dateapply >= '2017-09-17' 
    AND h.orderstatus IN ('complete', 'backorder') 
GROUP BY d.rec ORDER BY d.dateapply;