运行时预定义视图与查询 - mysql

Posted

技术标签:

【中文标题】运行时预定义视图与查询 - mysql【英文标题】:Predefined view vs query at runtime - mysql 【发布时间】:2013-08-29 16:08:04 【问题描述】:

我需要知道哪种方式会更有效。

方法一:在mysql中创建预定义视图如下。

创建视图 TestView As 从表 1 中选择 * 联合所有 从表 2 中选择 *

创建此视图后,我查询为

select * from TestView where col_value = 5

方法 2:我在运行时运行以下查询

从表 1 中选择 *,其中 col_value = 5 联合所有 select * from Table2 where col_value = 5

在第一种方法中,视图可以有超过 100,000 条记录。它必须从中找到记录“col_value = 5”。

两者都会给我相同的结果,但我想知道哪一个在性能方面更好。

【问题讨论】:

【参考方案1】:

在您的“方法 1”中,您的查询

SELECT * FROM TestView WHERE col_value = 5

实际上等价于:

SELECT * FROM (
    SELECT * FROM Table1
    UNION ALL
    SELECT * FROM Table2
) AS v
WHERE col_value = 5

这基本上意味着:“从每个表中选择所有内容,合并结果然后过滤掉”。两个表中的所有记录都将被扫描并复制到一个临时表中,可能在磁盘上。此外,如果存在col_value 上的索引,则此查询无法使用该索引。

方法2更可取。

请注意,这并不总是正确的。在某些(许多)情况下,MySQL 能够使用视图将视图定义与查询进行智能合并(这称为MERGE algorithm)。在这种情况下,性能几乎完全相同。在您的示例中,UNIONclause 的存在阻止了这种优化。

P.S:查看EXPLAIN

【讨论】:

感谢您的回复。至于另一种情况,我必须使用视图连接(不是 UNION)2 个表……那么方法 1 或方法 2 更可取? 这真的取决于视图定义。在大多数情况下,当视图不包含我链接的页面中列出的任何结构时,任何一种方法都会执行相同的操作。

以上是关于运行时预定义视图与查询 - mysql的主要内容,如果未能解决你的问题,请参考以下文章

mysql视图

MySQL-视图和索引

Mysql视图

MYSQL

MYSQL

mysql 之视图简述