加速超时的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;`
答
对于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;
'dateapply'是什么字段类型? – JNevill
你有索引on dateapply和orderstatus? – sskoko
理想的事情是为正在连接和过滤的表添加适当的索引。但是既然你不能改变桌子......我猜测你运气不好?除非添加索引不计算为“无法更改” – knittl