【发布时间】:2011-11-24 02:44:55
【问题描述】:
这是一个奇怪的问题。我正在尝试在 MySQL 中使用视图(我对 MySQL 相当陌生,对 Sybase 和 SQL Server 有更多经验)。无论如何,这个新项目我们正在使用 MySQL,因为它似乎具有良好的性能。然而,为了让 Web 前端的查询更简单,我们决定创建一些视图,它们都运行良好,但它们需要很长时间才能运行。
视图非常简单,只需选择语句(这些表中确实有几百万行)。比如说这个查询:
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, SIMPLE, classifier_results, ALL, idx_date, , , , 594845, 使用where;使用临时的;使用文件排序
视图选择给出:
1, 初级, , 全部, , , , , 100,
2、DERIVED、classifier_results、ALL、idx_date、、、、、594845、使用where;使用临时的;使用文件排序
【问题讨论】:
-
如果对查询和视图选择都使用 EXPLAIN,会得到不同的结果吗?
-
已添加到问题中。查询计划看起来是一样的,我假设 eprimary 只是视图的返回,因为它在某种意义上是嵌套的,没有什么表明需要额外运行 20 秒以上......
-
我认为
DERIVED表示它正在使用临时表,这会影响性能 -
我觉得它看起来不错。但是所以你冷静一下,我已经删除了 tildas。现在开心?有什么成果吗?
-
我似乎记得 MySQL 的 VIEW 并不像您在其他引擎中发现的那样优化。一个快速的谷歌搜索让我看到这篇关于MySQL VIEW as performance troublemaker的文章
标签: mysql sql view query-optimization