我需要知道哪一种更有效率。
创建视图TestView为
从表1中选择* 工会全部 从表2中选择*
创建此视图后,我正在查询
从TestView中选择*,其中col_value = 5
从表1中选择*,其中col_value = 5
工会全部 从表2中选择*,其中col_value = 5
在第一种方法中,视图可以有超过100,000条记录。必须从中找到记录“col_value = 5”。
两者都会给我相同的结果,但我想知道哪一个在性能上更好。
答案 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