2017-10-16 96 views
0

我試圖從多個表中獲取數據,這些數據需要合併在一起進行報告。我正在嘗試獲取每個在特定日期後完成的每個標題的所有詳細信息,並且必須檢查由於不良數據而導致的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

回答

1

對於header

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

對於detail

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

列的順序是經過深思熟慮的。由於我無法確定優化器將從哪個表開始,因此我提供的索引應該是最優的。

如果兩個dateapply列同步,那麼可能會進一步優化。

0

在我的同事和我之間,我們想出了下面的查詢,它可以更快地返回結果。 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;