Mysql 通过连接两个表创建的视图是否读取未查询/未使用的列?
关于这个过于简单的例子: 在这个数据库方案中Mysql 通过连接两个表创建的视图是否读取未查询/未使用的列?,mysql,sql,Mysql,Sql,关于这个过于简单的例子: 在这个数据库方案中 +--------------+ +-------------------+ | MASTER_TABLE | | FILES_TABLE | +-----+--------+ +-----+------+------+ | nID | field | | nID | meta | BLOB | +-----+--------+ +-----+------+------+ | 1 | ... | | 1 |
+--------------+ +-------------------+
| 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?(读作:查询视图会比只查询主表慢得多吗)
我这样问是因为列BLOB将用于存储文件。我们首先将表一分为二的原因是为了加快master_表的查询速度
免责声明: 设计数据结构时,项目经理决定,数据附带的文件应存储在数据库中,而不是文件系统中
我很清楚关于在数据库中存储文件与在文件系统中存储文件的众多激烈讨论,但正如我所说,这不是我自己决定的,我也无权更改决定。不,只有构建视图的查询所需的select中列出的字段是“读取”的。但是,任何联接都会影响select时间,而不仅仅是一个table select语句 因为你没有在视图中使用blob字段,所以你不会接受这个点击 如果
nid
在master
和file
表中都被索引,那么性能应该相当好
如果在
文件
表上有一个(nid,meta)的复合索引,则此视图联接的最佳性能将是。这假设meta不是太大,不足以成为复合索引的一部分。否,只有生成视图的查询所需的select中列出的字段是“读取”字段。但是,任何联接都会影响select时间,而不仅仅是一个table select语句
因为你没有在视图中使用blob字段,所以你不会接受这个点击
如果nid
在master
和file
表中都被索引,那么性能应该相当好
如果在
文件
表上有一个(nid,meta)的复合索引,则此视图联接的最佳性能将是。这假设meta不是太大,不能成为复合索引的一部分。请确保通过EXPLAIN运行select语句,以确认正在使用键。您是否误以为访问表会读取查询中未提及的列?无论是使用视图还是普通查询,从未读过未使用的列。@Barmar MySQL文档在本文中并不明确,我承认我是该主题的初学者。请确保通过EXPLAIN运行select语句以确认使用了键。您是否误以为访问表会读取查询中未提及的列?无论您使用的是视图还是普通查询,都不会读取未使用的列。@Barmar MySQL文档在本文中并不明确,我承认我是该主题的初学者。这里的Meta表示不止一列,尽管该数字小于16(复合索引列限制)。这个建议实际上可能是一个好主意,尽管我必须检查这些值是否“唯一”足以构成一个好的索引。@Tivie复合索引中的元的点不是通过增加索引的cardnality来加速,而是为了避免通过非索引原始表的主键进行第二次点查找。除非查询中需要的所有值都是索引的一部分,否则所有索引查找最终都会通过PK对原始表执行点查找。因此,复合索引覆盖了一个查询。啊!我不知道。这个信息实际上非常有用。这里的Meta表示不止一列,尽管这个数字小于16(复合索引列限制)。这个建议实际上可能是一个好主意,尽管我必须检查这些值是否“唯一”足以构成一个好的索引。@Tivie复合索引中的元的点不是通过增加索引的cardnality来加速,而是为了避免通过非索引原始表的主键进行第二次点查找。除非查询中需要的所有值都是索引的一部分,否则所有索引查找最终都会通过PK对原始表执行点查找。因此,复合索引覆盖了一个查询。啊!我不知道。这些信息实际上非常有用。