【问题标题】:Is a MySQL view faster than a normal query?MySQL 视图是否比普通查询快?
【发布时间】:2011-06-14 22:20:01
【问题描述】:

我有一个使用许多连接(实际上是 8 个连接)的复杂查询。我正在考虑将其简化为视图。经过一些研究,我可以看到简单性和安全性的好处。但我没有看到任何提到速度的内容。

视图是否像预编译语句一样工作,查询是预编译的?使用视图是否有显着的性能提升?

【问题讨论】:

  • 有些数据库会预编译视图,但我不相信 MySQL 会。你可能想看看这个问题:stackoverflow.com/questions/1021319/how-to-optimize-mysql-views
  • 与答案相反 - 根据我的经验,对于具有大量连接的视图,直接查询运行速度更快。
  • 我同意约书亚的观点。在 MySQL 认证期间有人告诉我,视图运行得更快(并且逻辑化),但在经验中,我发现直接查询具有多个连接的复杂查询比查询具有自己连接的视图更快

标签: mysql optimization view


【解决方案1】:

不,视图只是一个存储的文本查询。您可以针对它应用WHEREORDER,执行计划将在考虑这些子句的情况下计算。

【讨论】:

  • 这并非完全正确。如果您为视图算法选择合并基本上是正确的,但是如果您选择 temptable 它将实现。未定义(默认,如果未指定)让 MySQL 选择,它可以做一些你可能没想到的事情。
  • 我不是 MySQL 专家,但我很确定 TempTable 算法控制 MySQL 在请求结果时如何处理视图,并且对视图的存储方式完全没有影响。
  • 是的,这与只执行一段文本就好像它是一个临时查询完全不同。
  • 也许您比我更了解,但在我看来是的,视图是存储的文本,在请求其结果时会被解释。 TempTable 只是告诉 MySQL 在运行时使用临时表执行评估,而不是尝试修改原始查询的 SQL 以包含视图定义。视图创建时不会对视图 SQL 的内容进行预计算或分析。
  • 这个答案并不完全正确。您绝对应该在这个问题中查看已接受的答案:dba.stackexchange.com/questions/16372/…
【解决方案2】:

视图基本上是一个存储的子查询。基本上没有区别:

SELECT *
FROM someview

SELECT *
FROM (
    SELECT somestuff 
    FROM underlying table
);

除了视图更便携,因为您不必在每次想要使用它返回的任何数据时都写出底层查询。

【讨论】:

  • 如果MySql选择了一个临时视图算法呢?
  • 我完全不同意。 MySQL VIEW 不仅仅是存储的查询字符串的别名。如果使用正确与否,您可能会获得巨大的性能收益或损失。有关详细信息,请参阅我的答案。
【解决方案3】:

它有时会有所帮助,但它不是灵丹妙药。我已经看到了视图帮助性能,但我也看到它伤害了它。视图可以强制实现,如果 MySQL 没有为您选择一个好的访问路径,这有时可以为您提供更好的访问路径。

【讨论】:

  • MySQL 不支持物化视图。所以我看不到它如何帮助提高等效查询的性能......
  • 他们不叫它物化视图,但“temptable”是视图算法之一,大致顾名思义
  • 我已经查过这个,并且诱惑算法绝对不是物化视图的一个版本。迄今为止,MySQL 不支持物化视图或任何形式的预求解视图(除非您定期手动将视图投影到表中)。
猜你喜欢
  • 2021-06-11
  • 2016-06-25
  • 2011-03-14
  • 1970-01-01
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
  • 2017-05-15
  • 2019-06-30
相关资源
最近更新 更多