在MySQL中有效地获取前一条记录(按索引)

时间:2014-01-31 13:49:39

标签: mysql sql indexing

我有一个复合索引(在'name'VARCHAR(50)和'ts'TIMESTAMP列上)。

对于特定记录,我希望按时间找到前面的记录,并使用相同的“名称”(如果存在)。

(当使用低级非关系数据库,例如D-ISAM时,这很快且很简单。)

我如何在MySQL中执行此操作?

2 个答案:

答案 0 :(得分:1)

这是一种方法。查找与您要查找的记录具有相同name的所有行。然后按ts按相反的顺序排序并选择第一个:

select t.*
from table t join
     (select * from table t where <record = your record>
     ) therec
     on t.name = therec.name and t.ts < therec.ts
order by t.ts desc
limit 1;

答案 1 :(得分:0)

我能找到的所有帮助都与@ GordonLinoff的答案一致。

最后,我通过在每条记录中添加一个'seq'uence数字来解决问题,显示它与索引的距离。

这只是数据仅附加的解决方案,但这是我的用例。

我添加了以下值:

SET @num := 0;
UPDATE my_table
SET seq = @num := @num + 1
WHERE name = "my name"
ORDER BY ts, id

这很有效,但很难看。它大致以O(n)运行,而子查询方法是O(N ^ 2),对于超过几千行的任何东西都是不切实际的。