1

我为我的 corona/lua 应用程序创建了一个带有 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

唯一的问题是大约 18 MB 的 db 文件大小变成了 29.5 MB

4

3 回答 3

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
于 2013-10-24T21:37:37.713 回答
0

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

如果只选择值/SELECT value FROM ..哈希(尝试使用和不使用这样的覆盖索引。(id, value)

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

于 2013-10-24T20:21:40.727 回答
0

如前所述,确保你有一个关于 ID 的索引。

如果您现在无法更改表架构,您可以添加一个临时索引:

CREATE INDEX test_id ON test (id);

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

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

除非您使用散列来节省空间,否则您会在应用程序中浪费处理器时间来计算散列。

于 2013-10-25T08:05:49.700 回答