【问题标题】:SQLite data retrieve with select taking too longSQLite 数据检索与选择花费太长时间
【发布时间】:2013-10-24 20:14:43
【问题描述】:

我为我的 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

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

【问题讨论】:

    标签: sqlite select lua coronasdk


    【解决方案1】:

    您应该使用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
    

    【讨论】:

      【解决方案2】:

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

      如果只选择值/哈希码 (SELECT value FROM ..),在(id, value) 上设置一个覆盖索引 可能是有益的,因为这样可以避免额外查找行数据(请参阅@987654321 @)。尝试使用和不使用这样的覆盖索引。

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

      【讨论】:

      • +1 表示索引,-1 表示缓存(在 sqlite 中很少有回报,因为该行无论如何都会在 CPU 缓存中,并且不涉及网络 I/O。)
      • 当您说覆盖索引时,您的意思是数字索引,例如 1,2,3,4... 会有帮助吗?
      • @ossumsiul 覆盖索引是一种复合索引,包含查询结果所需的附加数据(它的好处是减少对主记录的附加访问,并具有复制物理数据的副作用)。例如,both (id, value) 上的复合索引“覆盖”value 列,即使只有 id 列(出现在 WHERE 中)用于查找 value。帖子中关于 SQLite 查询计划器的文章很好地解释了这可能如何提供帮助。
      【解决方案3】:

      如前所述,确保您在 ID 上有一个索引。

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

      CREATE INDEX test_id ON test (id);
      

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

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

      除非您的散列是为了节省空间,否则您是在浪费处理器时间在应用程序中计算散列。

      【讨论】:

        猜你喜欢
        • 2011-12-06
        • 2012-03-17
        • 1970-01-01
        • 2017-10-03
        • 1970-01-01
        • 1970-01-01
        • 2020-11-06
        • 2014-08-19
        • 1970-01-01
        相关资源
        最近更新 更多