规范化表,SQL连接和视图

时间:2013-07-03 17:42:18

标签: mysql sql

我正在创建一个预订应用程序,并尽可能地对数据库进行规范化。我的问题如下,我应该在数据库中创建视图,在我对WHERE子句中的组合视图进行选择性选择之前再次组合表,还是在视图中加入表之前更好地过滤表?

编辑:包含的例子。

第一个场景首先创建组合视图,然后在组合视图上执行SELECT(此视图可能有数千条记录):

CREATE VIEW appc as 
SELECT * FROM appointment
LEFT OUTER JOIN chair
ON appointment.chair_idchair = chair.idchair

SELECT * FROM appc
WHERE chair_idchair = 1;

第二个场景将首先过滤联接左侧的表,然后根据过滤的表创建一个视图,然后使用这个小得多的视图进行连接:

CREATE VIEW appf as 
SELECT * FROM appointment
WHERE chair_idchair = 1;

SELECT * FROM appf
LEFT OUTER JOIN chair
ON appf.chair_idchair = chair.idchair

2 个答案:

答案 0 :(得分:1)

作为一般规则,优化器非常智能,在构建查询计划时可以直接看到视图。如果您尝试通过预先选择一些数据来“帮助”优化器,那么您可能会隐藏优化器中的信息,这些信息可以让它创建更智能,更优化的计划。

答案 1 :(得分:1)

对MySQL没什么区别。 MySQL(与其他一些RDBMS品牌不同)不会在视图中存储任何内容。将MySQL视图看作更像宏。在大多数情况下,查询视图与执行您定义为视图的查询完全相同。

在查询视图时在WHERE子句中应用后续条件与视图的查询非常透明地结合,就好像您已编写完整查询并再给它一个条件。

异常:您可以选择使用ALGORITHM=TEMPTABLE创建视图,以强制它将视图的结果存储在临时表中,然后应用您在查询中指定的额外条件。在这种情况下,最好在视图的查询中构建条件,以减小生成的临时表的大小。

有关详细信息,请参阅http://dev.mysql.com/doc/refman/5.6/en/view-algorithms.html