【发布时间】:2012-12-18 07:16:25
【问题描述】:
我正在尝试优化查询。
我的问题似乎与MySQL, Union ALL and LIMIT 相似,答案可能相同(恐怕)。但是在我的情况下,有更严格的限制 (1) 以及日期时间列上的索引。
所以我们开始:
为简单起见,让我们只有一个包含三个列的表:
- md5 (varchar)
- 值(varchar)。
- 上次更新(日期时间)
(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 ALL 不使用索引所以我认为你不能优化太多。
-
优先级如何确定?
-
查尔斯 - 谢谢。目前,优先级由应用程序本身定义。理论上它是动态的,但实际上它“或多或少”是静态的,因此它可以进入数据库(实际上请参见下面的我的一个 cmets)。我会尝试将prio放入数据库并使用index+limit+order by
标签: mysql sql optimization union explain