database - lua 和 lsqlite3 : speeding up select statement

标签 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

如您所见,我正在尝试按 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/

相关文章:

java - ibatis域类应该用作javabean吗?

c# - 与数据库的父子进程通信的最佳设计

sqlite - SQLite 的可扩展性如何?

ios - 如何在 Cordova 中压缩(压缩)SQLITE 数据库文件?

c# - 如何在Windows Phone 7 中使用SQLite 数据库?

mysql - Laravel 5 选择查询将我的链接变成奇怪的格式

sql - MS SQL 中查询的优先级

c# - C#中的多维数组访问性能

python - 基于用户历史推荐产品的高效库

mysql - HQL/MySQL 用于列出不同项和重复项