我正在尝试优化查询。
我的问题似乎与MySQL、Union ALL 和 LIMIT相似,答案可能相同(恐怕)。但是,在我的情况下,有更严格的限制 (1) 以及日期时间列上的索引。
所以我们开始:
为简单起见,让我们只有一个包含三个列的表:
- md5 (varchar)
- 值(varchar)。
- 最后更新(日期时间)
(md5, updated) 上有一个索引,因此在 md5 键上选择,按更新排序并限制为 1 将得到优化。
搜索应返回最多与 10 个 md5 键之一匹配的记录。键具有优先级。因此,如果有 prio 1 的记录,它将优先于 prio 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 吗?
或者唯一的选择是存储过程?