Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
加速超时的MySQL查询_Mysql_Query Optimization - Fatal编程技术网

加速超时的MySQL查询

加速超时的MySQL查询,mysql,query-optimization,Mysql,Query Optimization,我正在尝试从多个表中获取数据,这些表需要合并在一起进行报告。我正在尝试获取在某个日期之后完成的每个标题的所有详细信息,由于数据不正确,必须检查0日期 我正在处理遗留表,遗憾的是,这些表不是我创建的,也不能更改。此语句在我的应用程序中超时,在本地虚拟机上的数据库上运行大约需要40秒。是否可以重构查询以获得更好的性能?感谢您的帮助 SELECT detail.* FROM detail JOIN header ON detail.invoice = header.invoice WHER

我正在尝试从多个表中获取数据,这些表需要合并在一起进行报告。我正在尝试获取在某个日期之后完成的每个标题的所有详细信息,由于数据不正确,必须检查0日期

我正在处理遗留表,遗憾的是,这些表不是我创建的,也不能更改。此语句在我的应用程序中超时,在本地虚拟机上的数据库上运行大约需要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;`
对于标题:

详情如下:

列的顺序是经过深思熟虑的。因为我无法判断优化器将从哪个表开始,所以我提供了应该是最优的索引


如果两个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;