运行时预定义视图与查询 - 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)。在这种情况下,性能几乎完全相同。在您的示例中,UNION
clause 的存在阻止了这种优化。
P.S:查看EXPLAIN
【讨论】:
感谢您的回复。至于另一种情况,我必须使用视图连接(不是 UNION)2 个表……那么方法 1 或方法 2 更可取? 这真的取决于视图定义。在大多数情况下,当视图不包含我链接的页面中列出的任何结构时,任何一种方法都会执行相同的操作。以上是关于运行时预定义视图与查询 - mysql的主要内容,如果未能解决你的问题,请参考以下文章