這是一個奇怪的。我試圖在MySQL中使用視圖(我對MySQL有相當的新意,並且有更多的Sybase和SQL Server的經驗)。任何方式這個新項目我們使用MySQL,因爲它似乎有良好的性能。然而,爲了更簡單地查詢網絡前端,我們決定創建一些視圖,一切運行良好,但它們需要永遠運行。MySQL - 視圖 - 超慢查詢
意見非常簡單,只需選擇語句(這些表確實有幾百萬行)。例如說這個查詢:
SELECT CAST(classifier_results.msgDate as DATE) AS mdate
,classifier_results.objClass AS objClass
,COUNT(classifier_results.objClass) AS obj
,classifier_results.subjClass AS subjClass
,COUNT(classifier_results.subjClass) AS subj
FROM classifier_results
WHERE (classifier_results.msgDate >= (curdate() - 20))
GROUP BY
CAST(classifier_results.msgDate as DATE)
,classifier_results.objClass
,classifier_results.subjClass
ORDER BY classifier_results.msgDate DESC
當作爲一個正常選擇運行需要大約1.5秒返回結果。
然而,當這個查詢放入視圖(原樣) - 即
CREATE VIEW V1a_sentiment_AI_current AS
SELECT CAST(classifier_results.msgDate as DATE) AS mdate
,classifier_results.objClass AS objClass
,COUNT(classifier_results.objClass) AS obj
,classifier_results.subjClass AS subjClass
,COUNT(classifier_results.subjClass) AS subj
FROM classifier_results
WHERE (classifier_results.msgDate >= (curdate() - 20))
GROUP BY
CAST(classifier_results.msgDate as DATE)
,classifier_results.objClass
,classifier_results.subjClass
ORDER BY classifier_results.msgDate DESC
查詢需要大約10倍的時間(22-30秒)。所以我想也許有一些優化或查詢緩存,不適用於視圖或可能有一些我們已經錯過了在MySQL配置設置。但是有什麼辦法可以加速這個視圖,所以它只是這個查詢的一個很好的佔位符?
運行EXPLAIN在兩個查詢: 正常的選擇給出了:
1,操作簡便,classifier_results,ALL,idx_date,,,,594845,使用其中;使用臨時;使用文件排序
的視圖中選擇給出:
1,PRIMARY,ALL,,,,,100,
2,衍生classifier_results,ALL,idx_date,,,,594845,使用哪裏;使用臨時;使用文件排序
如果在查看和從視圖中選擇時使用EXPLAIN,你會得到不同的結果嗎? – Cocowalla
已添加到問題中。查詢計劃看起來是一樣的,即時假設eprimary只是從視圖返回,因爲它是嵌套在某種意義上,沒有什麼可以指示20秒+額外運行.... – NightWolf
我認爲'DERIVED'意味着它正在使用一個臨時表,這是殺害性能 – Cocowalla