我在SQLite中有一个基本上具有以下内容的表:
id : integer (primary key)
name: text
timestamp: text
data1: integer
data2: integer
...
data6: integer
我需要按名称和时间戳进行过滤,所以我设置了(名称,时间戳)索引。
100,000,000行,SQLite在查询时抓取。理解索引会将时间复杂度从O(n)减少到O(log n),但它似乎仍然太慢。我不想将数据切分为多个表。有什么建议吗?
答案 0 :(得分:4)
您的时间戳应为数字。由于字符串的比较方式,对文本列进行过滤会显着减慢查询速度。
如果您还没有这样做,请将索引放在已排序(ORDER BY
)或已过滤(WHERE
,HAVING
的任何列上, JOIN ON
等。)。
最后,您过滤数据的顺序可能会有很大差异。按数字时间戳和名称进行过滤通常比按名称和数字时间戳过滤要快得多。尝试更改表达式的顺序。例如,WHERE day = ?, month = ?, year = ?
通常比WHERE year = ?, month = ?, day = ?
快得多。
答案 1 :(得分:4)
对于咯咯笑,我创建了一个sqlite3数据库,其中包含OP的模式,包含100'000'000行,6GB未编制索引的数据库文件,使用文本日期戳。
使用索引,数据库文件的大小加倍。有一个漂亮的步行台式机老式2008(2GB RAM,5k BogoMIPS)查询
select * from big where date = "2010-09-20 04:54:45.586836";
在不到8秒的挂钟时间内返回10k行。我希望这些数字对比较有用。