lua和lsqlite3:加速select语句

时间:2012-04-13 15:35:57

标签: database performance sqlite lua

我正在使用lsqlite3 lua包装器,并且我正在对数据库进行查询。我的数据库有大约500万行,我用来检索行的代码类似于:

db = lsqlite3.open('mydb')
local temp = {}
local sql = "SELECT A,B FROM tab where FOO=BAR ORDER BY A DESC LIMIT N"
for row in db:nrows(sql) do temp[row['key']] = row['col1'] end

正如您所看到的那样,我试图按N的降序排序前FOO行(我希望得到顶行,然后应用LIMIT而不是相反)。我将列A编入索引,但它似乎没有太大的区别。我怎样才能让它更快?

1 个答案:

答案 0 :(得分:3)

您需要索引过滤的列(即使用WHERE子句)。原因是ORDER BY在过滤之后进入,而不是相反。

所以你可能应该在FOO上创建一个索引。

您可以发布您的表架构吗?

<强>更新

此外,您可以增加sqlite cache,例如:

PRAGMA cache_size=100000

您可以根据可用内存和数据库大小进行调整。

更新2

我想更好地了解sqlite如何处理您的查询,您可以要求它为您提供查询计划:

http://www.sqlite.org/eqp.html

更新3

我的初步答案没有正确理解你的背景。如果您要对某些大型数据集进行ORDER BY,您可能希望使用该索引,而不是前一个索引,因此您可以告诉sqlite不要以这种方式使用FOO上的索引:

SELECT a, b FROM foo WHERE +a > 30 ORDER BY b