我在 SQLite 中有一个表,它基本上具有以下内容:
id : integer (primary key)
name: text
timestamp: text
data1: integer
data2: integer
...
data6: integer
我需要按名称和时间戳进行过滤,所以我设置了(名称,时间戳)索引。
在 100,000,000 行时,SQLite 在查询时爬行。了解索引将时间复杂度从 O(n) 降低到 O(log n) 但它似乎仍然太慢。我不喜欢将数据分成多个表。有什么建议吗?
最佳答案
您的时间戳应该是数字。由于比较字符串的方式,过滤文本列会显着减慢查询速度。
如果您还没有这样做,请将索引放在已排序 (ORDER BY
) 或过滤 (WHERE
的 any 列上, HAVING
,JOIN ON
等)。
最后,您过滤数据的顺序可能会有很大的不同。按数字时间戳然后按名称过滤通常比按名称然后按数字时间戳过滤要快得多。尝试改变你的表达顺序。例如,WHERE day = ?, month = ?, year = ?
通常比 WHERE year = ?, month = ?, day = ?
快得多。
关于SQLite 在数百万行后减速,如何加速?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3748489/