优化查询性能:UNION与UNION ALL的区别

2023年 8月 14日 76.3k 0

作用

在SQL查询中,当我们需要合并多个查询结果集时,我们通常会使用UNION和UNION ALL操作符,同时,如果你写的or语句不走索引,可以考虑使用UNION、UNION ALL优化。

在本篇博客中,我们将探讨UNION和UNION ALL的区别以及如何选择合适的操作符来提高查询性能。

UNION

首先,让我们来看看UNION操作符。UNION用于合并多个查询结果,并且会自动去除重复的行,确保最终的结果集中没有重复数据。这种去重操作的好处是我们可以获得干净、唯一的结果集,但同时也带来了性能开销。去重操作需要比较和过滤结果集中的每一行,这可能会导致较大的性能消耗。因此,在使用UNION操作符时,需要权衡结果集的唯一性和性能开销之间的折衷。

UNION ALL

与之相对的是UNION ALL操作符。UNION ALL也用于合并多个查询结果,但与UNION不同的是,它不进行去重操作。这意味着UNION ALL返回的结果集可能包含重复的行。然而,由于没有去重的开销,UNION ALL的性能通常比UNION更好。如果我们已经确保结果集中没有重复行,或者我们不关心结果集中的重复行,那么使用UNION ALL可以获得更好的查询性能。

两者区别

  • 结果集:UNION会在结果集中去重
  • 结果集顺序:UNION会在最终结果集进行排序,UNION ALL不会进行排序,结果集顺序由各个子查询顺序决定
  • 性能:由于UNION会去重和排序,因此UNION ALL的性能要优于UNION。

UNION/UNION ALL使用案例

create table products
(
id int auto_increment
primary key,
name varchar(255) not null,
price decimal(10, 2) not null,
description text null,
created_at timestamp default CURRENT_TIMESTAMP null,
updated_at timestamp default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP,
type tinyint not null comment '商品类型'
);

create index idx_name_prefix
on products (name(7));

create index idx_type
on products (type);

create index products_name_index
on products (name desc);

create index products_price_index
on products (price desc);

# 1.执行
CREATE PROCEDURE generate_test_data()
BEGIN
DECLARE counter INT DEFAULT 1;

WHILE counter

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论