MySQL View的性能比底层查询的性能更差

Job*_*obu 3 mysql performance view

我有一个使用以下定义的MySQL视图(JOIN为简洁起见,省略了语句)。

CREATE VIEW vw_example AS 
SELECT a, b, c FROM x, y, z
Run Code Online (Sandbox Code Playgroud)

多次重复的SELECT a, b, c FROM x, y, z速度是的5倍SELECT a, b, c FROM vw_example

我想了解这是为什么,以及如何使SELECT FROM vw_example性能与基础内联SELECT FROM x, y, z

Kir*_*ing 5

尽管您在示例查询中未显示DISTINCT,但最近我发现这是直接运行查询与以视图运行查询之间性能差异的唯一区别因素。

通过对我的查询执行SELECT DISTINCT在726,000行表和303,000行表上进行INNER JOIN,将3个列联接在一起(每个表都有索引),直接查询的运行时间约为0.15-0.16s。当我使用通过相同查询创建的VIEW时(无其他)时,持续时间约为142-145s或大约10 ^ 3倍。

删除DISTINCT会将查询本身和基于该查询的视图都减少到0.016s-几乎没有任何区别。

我无法理解原因-仅在一种情况下识别一个原因。


Nev*_*uyt 1

很难做到精确 - 最好的调查方法是对两种类型的查询运行 EXPLAIN

但是,我怀疑查询缓存是其核心 - 重新运行相同的查询将为查询缓存提供种子,除非底层数据发生变化,或者缓存被刷新,否则您可能会从缓存中受益。

您也希望在访问视图时获得这种好处,但缓存是不确定的,我的猜测是,不知何故,您针对视图的查询并没有从缓存中受益。

如果 EXPLAIN 相同,那将是最好的解释......