0

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

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

创建视图 TestView As
select * from Table1
union all
select * from Table2

创建此视图后,我查询为

select * from TestView where col_value = 5

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

select * from Table1 where col_value = 5
union all
select * from Table2 where col_value = 5

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

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

4

1 回答 1

0

在您的“方法 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算法)。在这种情况下,性能几乎完全相同。在您的示例中,UNION子句的存在阻止了这种优化。

PS:退房EXPLAIN

于 2013-08-29T16:46:41.963 回答