我为我的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
答案 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针对高效搜索进行了优化,可以通过索引大大改进。
除非你想要节省空间,否则你在应用程序中浪费处理器时间计算哈希值。