我正在使用 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
列编制了索引,但似乎并没有太大区别。我怎样才能让它更快?
最佳答案
您需要索引您过滤的列(即使用 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
关于database - lua 和 lsqlite3 : speeding up select statement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10143886/