我有一个数据库,由以下列组成
id
, 一个看起来像这样的字符串8b28347448d3fff
(15 长)x
, 小数 (8,6)y
, 小数 (9,6)
所有列上都有索引。现在,我想找到匹配的对。在表侧foo
,最多可以有 300k 行。我能想到的查询表的方法有两种。首先,这个:
使用WHERE ... IN
. 在查询方面,可能有多达 11k 个元素possible_matching_indexes
。
SELECT id FROM foo WHERE id IN (possible_matching_indexes);
另一个是这个,它只会在查询端产生四个值( x1
, x2
, y1
, )y2
SELECT id FROM foo WHERE (x BETWEEN x1 and x2) AND (x BETWEEN y1 and y2);
哪一个更有可能表现更好?我正在使用 SQLite 数据库。但我想这可以从任何基于 SQL 的数据库中估计出来?
通常已知该
IN
子句能够在多个数据库系统之间的某些情况下(通常具有较大的项目列表)引起基数估计问题。IN
我不能专门为 SQLite 说话,但无论如何,11k 都是一个子句中的很多东西。该IN
子句在逻辑上类似于一堆OR
s。如果这是您仅有的两个选项,我会投票支持范围过滤器。但我更喜欢第三种选择。由于您似乎
id
已经知道所需的 11k 项中的 s,因此您应该将它们放在一个临时表中,然后foo
通过id
字段将该表连接到您的实际表中。这是一种更具关系性的方法,通常在IN
子句中的大型列表上效果更好。当然,提到的任何解决方案都取决于您的表
foo
是否被正确索引。就像 Verace 提到的那样,找出答案的最好方法就是进行测试,因为有很多细粒度的因素会影响性能。上述建议只是一般指导。