Sqlite:在由整数元组组成的表中查找下一个或上一个元素

std*_*map 8 order-by query-performance performance-tuning sqlite3

我有一个名为 tuples 的 sqlite 表,定义如下

create table tuples
(
    a INTEGER not null,
    b INTEGER not null,
    c INTEGER not null,
    d INTEGER not null,
    primary key (a, b, c, d)
) without rowid;
Run Code Online (Sandbox Code Playgroud)

充满了数百万个独特的元组 (>1TB)。新元组经常被插入,带有“随机”值。仅在极少数情况下才会删除行。

对于访问数据库的外部进程,我需要在表中找到“下一个”或“上一个”现有的 4 元组。

例如:给定元组 (1-1-1-1)、(1-1-1-4) 和 (1-2-3-4),对于元组 (1-1-1-3)(不需要存在于表中)“下一个”元素是(1-1-1-4),前一个是(1-1-1-1)(两者都需要存在)。因为 (1-1-1-4) (1-2-3-4) 是“下一个”元素。Corner-case:如果实际上没有“next”或“previous”元素,则结果允许为空。(1-2-3-4) 没有“下一个”元素。

目前我试图找到下一个元组 ("center" is (1-1-1-3))

select a,b,c,d from tuple
where (a == 1 AND b == 1 AND c == 1 AND d > 3) OR
      (a == 1 AND b == 1 AND c > 1) OR
      (a == 1 AND b > 1) OR
      (a > 1)
order by a, b, c, d
limit 1;
Run Code Online (Sandbox Code Playgroud)

这真的很慢。

这里的简短问题是:有没有办法加快这个过程?理想情况下,响应应该只需要几毫秒,就像搜索元组的确切值(基本上是瞬时的)。使用其他/更多索引、多个和/或其他查询,甚至更改数据库结构都是有效的解决方案。


编辑:元组的每个元素可能涵盖整个允许的整数范围。

Aki*_*ina 9

目前我试图找到下一个元组 ("center" is (1-1-1-3))

测试

SELECT *
FROM tuples
WHERE (1,1,1,3) < (a,b,c,d)
ORDER BY a,b,c,d LIMIT 1
Run Code Online (Sandbox Code Playgroud)

小提琴