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

时间:2013-08-29 16:08:05

标签: mysql database-performance

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

方法1:在mysql中创建预定义视图,如下所示。

  

创建视图TestView为
  从表1中选择*   工会全部   从表2中选择*

创建此视图后,我正在查询

  

从TestView中选择*,其中col_value = 5

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

  

从表1中选择*,其中col_value = 5
  工会全部   从表2中选择*,其中col_value = 5

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

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

1 个答案:

答案 0 :(得分: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 algorithm)。在这种情况下,性能几乎完全相同。在您的示例中,UNION子句的存在会阻止此优化。

P.S:看看EXPLAIN