Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL从有序列中选择_Sql_Sqlite - Fatal编程技术网

SQL从有序列中选择

SQL从有序列中选择,sql,sqlite,Sql,Sqlite,我有一个大型的sqlite3素数数据库,其.schema如下: CREATE TABLE Primes(id INTEGER PRIMARY KEY, prime); 我正在尝试提高以下查询的查找速度: SELECT * FROM Primes WHERE prime < SOME_NUMBER ORDER BY id ASC; 正如我所知,id和prime列都是有序的,查询应该能够在找到prime>=SOME_NUMBERis后立即停止。我理解为什么它没有,因为sqlite3无法知道

我有一个大型的sqlite3素数数据库,其.schema如下:

CREATE TABLE Primes(id INTEGER PRIMARY KEY, prime);
我正在尝试提高以下查询的查找速度:

SELECT * FROM Primes WHERE prime < SOME_NUMBER ORDER BY id ASC;
正如我所知,id和prime列都是有序的,查询应该能够在找到prime>=SOME_NUMBERis后立即停止。我理解为什么它没有,因为sqlite3无法知道素数是经过排序的

我是否可以对表进行任何修改,以使sqlite3知道prime列已排序?请注意,数据库是定期扩展的,写入速度很重要,也就是说,从我的经验来看,索引可能不是一个好的选择

查询中是否有任何关键字可以让sqlite3在找到素数>=某个\u数后停止


以下是考虑因素:

如果某个_数相对较大,则查询将返回一大块行,索引不会有多大帮助。 如果您有许多查询,其中某个_数相对较小,那么查询将返回一小部分行,索引将有巨大的好处,因为另一个选项是一次又一次地扫描整个表。 在任何情况下,在一个表上有一个索引,并且您已经得到了一个id,这会对DML数据操作语言操作(包括插入)带来性能损失。 如果2的答案为“真”- 由于我估计插入100K值需要不到一秒*1的时间,使用2G值对表进行完整扫描需要大约3分钟,因此我建议创建索引

create unique index Primes_un_prime on Primes (prime);
请注意,这实际上是一个包含“prime”和“id”的覆盖索引

*一,

在prime fast上进行查找需要对此列进行索引

不必向该列添加索引,您可以使用带素数的作为键的第一列:

CREATE TABLE Primes(
    prime,
    id INTEGER,
    PRIMARY KEY (prime)        
) WITHOUT ROWID;
这使得对id的查找或排序变慢。
如果素数不是唯一的,则需要将id添加到PK。

按素数排序会在整个列被索引几秒钟后显示结果。我的原始查询具有相同的等待时间,但在显示结果之后。由于写读比为100000:1,我对添加索引有点怀疑,因为我已经读到,它可能会减慢插入操作。请看问题。如果您仍然认为这些建议可能有益,您是否介意详细说明一下?2亿/20亿+可以在一个小时或更长时间内再次检查?是的,我需要数据库中的id和结果,但不一定是按顺序排列的。在本例中,按id排列的顺序实际上是查询外观的残余,可以在我的问题查询中省略,而不会产生影响。此外,我们不会得到生成的id
CREATE TABLE Primes(
    prime,
    id INTEGER,
    PRIMARY KEY (prime)        
) WITHOUT ROWID;