加速超时的MySQL查询
我正在尝试从多个表中获取数据,这些表需要合并在一起进行报告。我正在尝试获取在某个日期之后完成的每个标题的所有详细信息,由于数据不正确,必须检查0日期 我正在处理遗留表,遗憾的是,这些表不是我创建的,也不能更改。此语句在我的应用程序中超时,在本地虚拟机上的数据库上运行大约需要40秒。是否可以重构查询以获得更好的性能?感谢您的帮助加速超时的MySQL查询,mysql,query-optimization,Mysql,Query Optimization,我正在尝试从多个表中获取数据,这些表需要合并在一起进行报告。我正在尝试获取在某个日期之后完成的每个标题的所有详细信息,由于数据不正确,必须检查0日期 我正在处理遗留表,遗憾的是,这些表不是我创建的,也不能更改。此语句在我的应用程序中超时,在本地虚拟机上的数据库上运行大约需要40秒。是否可以重构查询以获得更好的性能?感谢您的帮助 SELECT detail.* FROM detail JOIN header ON detail.invoice = header.invoice WHER
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;`
对于标题:
详情如下:
列的顺序是经过深思熟虑的。因为我无法判断优化器将从哪个表开始,所以我提供了应该是最优的索引
如果两个dateapply列是同步的,那么可能会有进一步的优化。在我的同事和我之间,我们提出了下面的查询,可以更快地返回结果。该小组消除了重复记录。我要感谢大家花时间帮助我研究我的问题,并期待着将来使用索引的可能性
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是什么字段类型?dateapply和orderstatus上有索引吗?明智的做法是向要联接和筛选的表添加适当的索引。但既然你不能换桌子……我想你是运气不好吧?除非添加索引不算作无法更改选择详细信息。*从详细信息连接选择*从header.dateapply>='2017-09-17'中的header.orderstatus和header.orderstatus中的'complete','backorder'作为h,其中ON detail.invoice=h.invoice WHERE detail.dateapply!='0000-00-00'和按细节订购。日期适用;尝试减少扫描行数并创建索引(如果未命中)。在询问有关查询优化的问题时,应始终为查询中引用的每个表发布SHOW create TABLE,并为查询发布当前解释。帮助我们,帮助你!
INDEX(invoice, dateapply)
INDEX(dateapply, invoice)
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;