1

我正在使用 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但似乎没有太大区别。我怎样才能让它更快?

4

1 回答 1

3

您需要索引您过滤的列(即使用 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-13T15:42:40.807 回答