MySQL - 视图 - 超慢查询

Nig*_*olf 9 mysql sql view query-optimization

这很奇怪.我正在尝试在MySQL中使用Views(对于具有Sybase和SQL Server的更多经验,我是MySQL的新手).无论如何,这个新项目我们都在使用MySQL,因为它似乎具有良好的性能.然而,为了简化Web前端的查询,我们决定创建一些视图,一切都运行良好,但它们需要永远运行.

视图非常简单,只是select语句(这些表中确实有几百万行).比如说这个查询:

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
Run Code Online (Sandbox Code Playgroud)

以正常方式运行时,大约需要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
Run Code Online (Sandbox Code Playgroud)

查询大约需要10倍(22-30秒).所以我想也许有一些优化或查询缓存不能与Views一起使用,或者我们在MySQL配置中错过了一些设置.但有没有办法加快这个视图,所以它只是这个查询的一个不错的占位符?

在两个查询上运行EXPLAIN:正常选择给出:

1,SIMPLE,classifier_results,ALL,idx_date ,,,, 594845,使用where; 使用临时; 使用filesort

视图选择给出:

1,PRIMARY ,, ALL
,,,,, 100,2,DERIVED,classifier_results,ALL,idx_date ,,,, 594845,使用where; 使用临时; 使用filesort

Coc*_*lla 2

尝试使用以下命令重新创建您的视图:

CREATE ALGORITHM = MERGE 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
Run Code Online (Sandbox Code Playgroud)

有关 MySQL 视图处理算法的更多信息可以在这里找到。