使用lua和lsqlite3加速select语句。

我正在使用 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

正如您所看到的,我正在尝试以降序按FOO排序获取前 N行(我想获取前几行然后应用 LIMIT而不是相反)。我对列A进行了索引,但似乎没有太大的区别。我如何使这个过程更快?

原文链接 https://stackoverflow.com/questions/10143886

点赞
stackoverflow用户88888888
stackoverflow用户88888888

你需要为进行过滤的列(即带有 WHERE 子句的列)建立索引。原因是 ORDER BY 在过滤之后发挥作用,而不是反过来。

因此,你可能应该在 FOO 上创建一个索引。

你能发布一下你的表架构吗?

更新

另外,你可以增加 sqlite 缓存,例如:

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
2012-04-13 15:42:40