SQLite数据检索选择耗时太长

时间:2013-10-24 20:14:43

标签: sqlite select lua corona

我为我的corona / lua app创建了一个带有sqlite的表。它是一个〜= 700 000值的哈希表。该表有两列,即哈希码(一个字符串)和值(另一个字符串)。在程序期间,我需要通过提供哈希码来多次获取数据。

我正在使用类似此代码的内容来获取数据:

for p in db:nrows([[SELECT * FROM test WHERE id=']].."hashcode"..[[';]]) do
    print(p) 
    -- p = returned value --
end

这句话虽然花费了太多时间来执行

感谢,

编辑:

成功! 错误是关键的主要问题。我将哈希码设置为主键,如下所示,检索时间正常:

CREATE TABLE IF NOT EXISTS test (id STRING PRIMARY KEY , array); 

我还提前准备了这些陈述,如你所说:

stmt = db:prepare("SELECT * FROM test WHERE id = ?;")
[...]
stmt:bind(1,s)
for p in stmt:nrows() do

唯一的问题是db文件大小大约为18 MB,大小为29,5 MB

3 个答案:

答案 0 :(得分:2)

您应该使用id作为唯一主键创建表格;这将自动生成一个索引。

create table if not exists test
(
    id text primary key,
    val text
);

您不应该使用字符串连接构造语句;这是一个安全问题,所以要避免养成这种习惯。此外,您应该在程序初始化时提前准备语句,并运行准备好的语句。

这样的东西......最初:

hashcode_query_stmt = db:prepare("SELECT * FROM test WHERE id = ?;")

然后每次使用:

hashcode_query_stmt:bind_values(hashcode)
for p in hashcode_query_stmt:urows() do ... end

答案 1 :(得分:0)

确保id / hashcode列上有索引?没有这样的查询将慢,慢,慢。该索引应该是唯一的。

如果只选择值/ hashcode(SELECT value FROM ..),那么覆盖索引超过(id, value)可能是有益的,因为这可以避免额外寻找行数据(见SQLite Query Planning)。尝试使用和不使用覆盖索引。

此外,如果多次查询相同的哈希码,则可能值得采用缓存

答案 2 :(得分:0)

如前所述,请确保您有ID索引。

如果您现在无法更改表架构,可以添加ad hoc索引:

CREATE INDEX test_id ON test (id);

关于哈希:如果您在软件中计算哈希值以加快搜索速度,请不要这样做!

SQLite将使用您提供的哈希作为任何常规字符串/ blob。此外,RDBMS针对高效搜索进行了优化,可以通过索引大大改进。

除非你想要节省空间,否则你在应用程序中浪费处理器时间计算哈希值。