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