Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
运行时预定义视图与查询-mysql_Mysql_Database Performance - Fatal编程技术网

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

运行时预定义视图与查询-mysql,mysql,database-performance,Mysql,Database Performance,我需要知道哪种方法更有效 方法1:在mysql中创建预定义视图,如下所示。 创建视图TestView作为 从表1中选择* 联合所有人 从表2中选择* 创建此视图后,我将作为 从列值=5的TestView中选择* 方法2:im在运行时运行以下查询 从表1中选择*,其中col_值=5 联合所有人 从表2中选择*,其中col_值=5 在第一种方法中,视图可以有超过100000条记录。它必须从中查找记录“col_value=5” 两者都会给我相同的结果,但我想知道哪一个在性能方面更好。在您的“方法1”中

我需要知道哪种方法更有效

方法1:在mysql中创建预定义视图,如下所示。 创建视图TestView作为
从表1中选择*
联合所有人
从表2中选择*

创建此视图后,我将作为

从列值=5的TestView中选择*

方法2:im在运行时运行以下查询 从表1中选择*,其中col_值=5
联合所有人
从表2中选择*,其中col_值=5

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

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

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

SELECT * FROM TestView WHERE col_value = 5
实际上相当于:

SELECT * FROM (
    SELECT * FROM Table1
    UNION ALL
    SELECT * FROM Table2
) AS v
WHERE col_value = 5
这基本上意味着:“从每个表中选择所有内容,合并结果,然后过滤掉”。两个表中的所有记录都将被扫描并复制到一个临时表中,可能在磁盘上。此外,如果存在这样的索引,则此查询无法在
列值上使用索引

方法2更可取

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


注:请查看

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