我最近已经了解了视图的概念,我发现它们对于将复杂查询拆分成部分非常有帮助。
我的问题是,当我开始从视图中查询时,有任何效率上的缺点,而这些视图又是来自其他视图的查询等...
所以我会举例:
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&的设计中有ORDER BY子句。 view3还是更好的是我没有在任何视图中放置任何ORDER BY子句,我只是在查询view3时使用ORDER BY?
非常感谢你的帮助! 博加。
答案 0 :(得分:2)
对于order by
,请参阅CREATE VIEW Syntax
视图定义中允许使用ORDER BY,但如果使用具有自己的ORDER BY的语句从视图中进行选择,则会忽略它。
在View Processing Algorithms上,您可以看到MySQL进程如何选择视图。一如既往,这取决于。 ; - )
似乎MERGE
算法效率最高,因为算法temptable
首先将视图结果复制到临时表并对其进行查询。但是你不能总是使用merge,参见最后一节
如果不能使用MERGE算法,则必须使用临时表。如果视图包含以下任何构造,则不能使用MERGE:
- 聚合函数(SUM(),MIN(),MAX(),COUNT()等)
- DISTINCT
- GROUP BY
- HAVING
- LIMIT
- UNION或UNION ALL
- 选择列表中的子查询
- 仅指文字值(在这种情况下,没有基础表)