【问题标题】:On the efficiency of using views of views in MySQLMySQL中视图使用视图的效率
【发布时间】:2012-11-21 22:14:56
【问题描述】:

我最近了解了视图的概念,我发现它们对于将复杂查询拆分为多个部分有很大帮助。

我的问题是,当我开始从视图进行查询时是否存在任何效率劣势,而这些视图又是来自其他视图的查询等...

所以我会例如:

view1 -> query from tables A, B & C
view2 -> query from tables D, E & F
view3 -> query joining view1 & view2

在查询 view3 而不是设计一个连接表 A、B、C、D、E 和 F 的单个查询时,会不会有任何速度劣势?

如果我选择使用视图方法,这有关系吗,我在 view1、view2 和 view3 的设计中是否有 ORDER BY 子句,或者我最好不要将任何 ORDER BY 子句放在任何的视图,我在查询 view3 时只使用 ORDER BY?

非常感谢您的帮助! 博加。

【问题讨论】:

  • Order By 通常不会对您的结果产生太大影响,除非您想获得例如top 5 with max revenue...names in alphabetical order with first 10 customers...等等。

标签: mysql views


【解决方案1】:

对于order by,请参阅CREATE VIEW Syntax

在视图定义中允许使用 ORDER BY,但如果您使用具有自己 ORDER BY 的语句从视图中进行选择,则会忽略它。

View Processing Algorithms 上,您可以看到 MySQL 如何处理视图上的选择。一如既往,这取决于。 ;-)

似乎MERGE 算法是最有效的,因为算法temptable 首先将视图结果复制到一个临时表并对其进行查询。但是你不能总是使用合并,见最后一节

如果不能使用 MERGE 算法,则必须使用临时表。如果视图包含以下任何构造,则不能使用 MERGE:

  • 聚合函数(SUM()、MIN()、MAX()、COUNT() 等)
  • 不同
  • 分组依据
  • 限制
  • UNION 或 UNION ALL
  • 选择列表中的子查询
  • 仅指文字值(在这种情况下,没有基础表)

【讨论】:

    猜你喜欢
    • 2011-09-19
    • 1970-01-01
    • 2021-10-13
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多