我正在尝试优化查询。
我的问题好像是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 实现吗?
或者唯一的选择是存储过程吗?
最佳答案
关于MySQL 优化 UNION 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14147172/