通过连接两个表创建的视图是否读取未查询/未使用的列?

时间:2012-11-20 20:59:17

标签: mysql sql

关于这个过于简单的例子:

在此数据库方案中

+--------------+  +-------------------+
| MASTER_TABLE |  |    FILES_TABLE    |
+-----+--------+  +-----+------+------+
| nID | field  |  | nID | meta | BLOB |
+-----+--------+  +-----+------+------+
|  1  | ...    |  |  1  |  ... | ...  |
+-----+--------+  +-----+------+------+

如果我创建这样的视图:

CREATE VIEW myView AS
SELECT master.*, file.meta 
FROM master_table master
LEFT JOIN files_table file
USING (nid)

在查询myView时是否读取了未使用的列BLOB?(读作:查询视图要慢得多,而不是仅查询master_table)

我问这个,因为列BLOB将用于存储文件。我们首先将表拆分为两个的原因是为了加快master_table的查询。


声明:

在设计数据结构时,项目经理决定将附加到数据的文件存储在数据库中,而不是存储在文件系统中。

我非常清楚有关在数据库和文件系统中存储文件的激烈讨论,但正如我所说,我没有决定,也没有权力改变决定。

1 个答案:

答案 0 :(得分:1)

不,只有构建视图的查询所需的选择中列出的字段才是“已读”。但是,任何连接都会影响选择时间而不仅仅是单个表选择语句。

由于你没有在视图中使用blob字段,所以你不会受到这种打击。

如果在nidmaster表中都为file编制索引,那么效果应该相当不错。

如果在file表上有(nid,meta)的复合索引,则此视图的JOIN的最佳性能。假设meta不是太大而不能成为复合索引的一部分。