2010-09-20 71 views
2

我在SQLite的一个表,基本上有以下几点:SQLite在数百万行后变慢,如何加速?

id : integer (primary key) 
name: text 
timestamp: text 
data1: integer 
data2: integer 
... 
data6: integer 

我需要通过名称和时间戳进行过滤,所以我有(名称,时间戳)指数成立。

在100,000,000行,SQLite在查询时进行爬网。了解索引可以将时间复杂度从O(n)降低到O(log n),但它似乎仍然太慢。我不想将数据分割成多个表格。有什么建议么?

+1

你能举一个例子查询吗?有可能你的查询没有使用你的索引。 – xscott 2010-09-20 03:30:06

+0

-1:如箭头所示“这个问题不清楚”。使用“慢”和样本查询的定义,“将成为”这个问题很有用“ – msw 2010-09-20 04:12:21

回答

4

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

如果你不这样做,把指标上任何列进行排序(ORDER BY)或过滤(WHEREHAVINGJOIN ON等)。

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

+0

SQLite有一个内置的DATETIME格式,它使用整数将数据实际存储在可读的文本表示之后...... – 2014-01-12 03:24:41

+0

但它不是数据类型(存储类),因此在进行任何查找时仍依赖于基础数据类型。原来的问题基本上是关于性能调优,在这种情况下,我仍然建议在时间戳上强制实施一个'NUMERIC'数据类型。我想知道最终如何解决这个问题。 – Andrew 2014-01-12 08:11:07

4

对于笑声,我创建了一个sqlite3数据库,其中包含使用文本日期戳的包含100'000'000行,6GB未标记数据库文件的OP架构。

通过索引,数据库文件的大小加倍。与一个漂亮的行人台式机老式2008(2GB RAM,5K BogoMIPS)查询

select * from big where date = "2010-09-20 04:54:45.586836"; 

在小于8秒挂钟时间返回10K行。我希望这些数字可用于比较。

+2

尝试使用数字时间戳而不是日期字符串,并查看它有多快。如果表格索引正确,您应该看到怪物差异。 SQLite很烦人,因为它没有日期或时间数据类型。 – Andrew 2010-09-26 04:46:04