SQLite 在数百万行后速度变慢,如何加快速度?

qre*_*est 4 sqlite scalability

我在 SQLite 中有一个表,基本上包含以下内容:

id : integer (primary key)
name: text
timestamp: text
data1: integer
data2: integer
...
data6: integer
Run Code Online (Sandbox Code Playgroud)

我需要按名称和时间戳进行过滤,因此我设置了(名称,时间戳)索引。

在 100,000,000 行时,SQLite 在查询时进行爬行。理解索引将时间复杂度从 O(n) 降低到 O(log n) 但看起来仍然太慢。我不喜欢将数据切片到多个表中。有什么建议么?

msw*_*msw 6

为了搞笑,我创建了一个 sqlite3 数据库,其中包含 OP 的架构,其中包含 100'000'000 行、使用文本日期戳的 6GB 无索引数据库文件。

通过索引,数据库文件的大小增加了一倍。使用 2008 款漂亮的步行台式机(2GB RAM,5k BogoMIPS)进行查询

select * from big where date = "2010-09-20 04:54:45.586836"; 
Run Code Online (Sandbox Code Playgroud)

在不到 8 秒的时间内返回 10k 行。我希望这些数字对于比较有用。

  • 尝试使用数字时间戳而不是日期字符串,看看它有多快。如果表索引正确,您应该会看到巨大的差异。SQLite 很烦人,因为它没有日期或时间数据类型。 (2认同)

And*_*rew 5

您的时间戳应该是数字。由于比较字符串的方式,对文本列进行过滤将显着减慢查询速度。

如果您还没有这样做,请将索引放在已排序 ( ) 或已过滤(、、等)的任何列上。ORDER BYWHEREHAVINGJOIN ON

最后,过滤数据的顺序可能会有很大差异。按数字时间戳然后名称过滤通常比按名称然后数字时间戳过滤要快得多。尝试改变表达的顺序。例如,WHERE day = ?, month = ?, year = ?通常会比 快得多WHERE year = ?, month = ?, day = ?