gpt4 book ai didi

mysql - 预定义 View 与运行时查询 - mysql

转载 作者:行者123 更新时间:2023-11-30 01:21:12 25 4
gpt4 key购买 nike

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

方法一:在mysql中创建预定义 View ,如下。

create view TestView As
select * from Table1
union all
select * from Table2

创建此 View 后,我查询为

select * from TestView where col_value = 5

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

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

在第一种方法中, View 可以包含超过 100,000 条记录。它必须从中找到记录“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

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

方法 2 是更好的选择。

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

PS:查看EXPLAIN

关于mysql - 预定义 View 与运行时查询 - mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18515920/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com