MySQL 优化 UNION 查询

标签 mysql sql optimization union explain

我正在尝试优化查询。

我的问题好像是MySQL, Union ALL and LIMIT答案可能是一样的(恐怕)。但是,在我的例子中,有一个更严格的限制 (1) 以及日期时间列上的索引。

我们开始吧:

为简单起见,让我们只有一个包含三个列的表格:

  • MD5(可变字符)
  • 值(可变字符)。
  • 上次更新(日期时间)

在 (md5, updated) 上有一个索引,因此选择 md5 键,按更新排序并限制为 1 将得到优化。

搜索应返回最多匹配 10 个 md5 键之一的记录。键具有优先权。因此,如果有优先级为 1 的记录,它将优先于优先级为 2、3 等的任何记录。

目前使用的是 UNION ALL:

select * from

(

(
select 0 prio, value
from mytable
where md5 = '7b76e7c87e1e697d08300fd9058ed1db'
order by lastupdated desc 
limit 1
)

union all

(
select 1 prio, value
from mytable
where md5 = 'eb36cd1c563ffedc6adaf8b74c259723'
order by lastupdated desc 
limit 1
)

) x

order by prio
limit 1;

它有效,但如果提供 10 个键,UNION 似乎会执行所有 10 个查询。

但是,从业务角度来看,按顺序运行选择并在第一次匹配后停止是可以的。

这可能通过纯 SQL 实现吗?

或者唯一的选择是存储过程吗?

最佳答案

有一个不需要 UNION 的更好的方法来做到这一点。您真的想要每个键的分组最大值,并具有自定义排序。

Groupwise Max

Order by FIELD()

关于MySQL 优化 UNION 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14147172/

相关文章:

c++ - libmysqlclient 竞争条件

mysql - 如何选择没有值的列?

php - 比较用户之间的相似度 PHP

sql - SQL中的计算模式

haskell - 使用 -hy 进行 GHC 堆分析 - 什么是 *(星号)?

javascript - 使用 .php MySQL 添加自定义 .png 标记到 map

mysql - SQL选择具有相同列值的行

php - 如何选择某些元键的所有元值?

Python CMA-ES 算法求解用户自定义函数和约束

C++检查char是元音还是辅音的最快方法