运行时预定义视图与查询-mysql
我需要知道哪种方法更有效 方法1:在mysql中创建预定义视图,如下所示。 创建视图TestView作为运行时预定义视图与查询-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中选择*
联合所有人
从表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更可取?这取决于视图定义。在大多数情况下,当视图不包含我链接的页面中列出的任何构造时,两种方法都将执行相同的操作。