关于这个过于简单的例子:
在此数据库方案中
+--------------+ +-------------------+
| 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的查询。
在设计数据结构时,项目经理决定将附加到数据的文件存储在数据库中,而不是存储在文件系统中。
我非常清楚有关在数据库和文件系统中存储文件的激烈讨论,但正如我所说,我没有决定,也没有权力改变决定。
答案 0 :(得分:1)
不,只有构建视图的查询所需的选择中列出的字段才是“已读”。但是,任何连接都会影响选择时间而不仅仅是单个表选择语句。
由于你没有在视图中使用blob字段,所以你不会受到这种打击。
如果在nid
和master
表中都为file
编制索引,那么效果应该相当不错。
如果在file
表上有(nid,meta)的复合索引,则此视图的JOIN的最佳性能。假设meta不是太大而不能成为复合索引的一部分。