轻量级内存数据库

时间:2013-01-24 18:45:31

标签: ruby-on-rails sqlite query-optimization

我们的一个需求是创建一个临时内存数据库,然后执行各种插入/选择/更新。

一目了然,SQLite满足了我们所有的需求。可以建立与内存中SQLite DB的连接,如下所示:

class SQLiteBase < ActiveRecord::Base
  self.abstract_class = true

  establish_connection(adapter:  'sqlite3', database: ':memory:')
end

前一段时间我们已经开始研究一些性能问题,结果发现我们需要在SQLite表中执行批量加载(特别是批量INSERT)数据(参见these基准测试)。 / p>

不幸的是,看起来SQLite不支持批量INSERT。

那么是否有其他基于SQL的轻量级内存数据库,支持批量INSERT

如果没有 - 有没有办法利用重量级数据库,如PostreSQL(MySQL或任何其他主要播放器)作为内存数据库

如果postresql / mysql不是一种可行的方式 - 是否还有其他C-heavy优化的数据结构,其上面有查询语言? (有/没有红宝石绑定)。

3 个答案:

答案 0 :(得分:2)

首先,SQLite确实使用以下方法支持批量插入:

  • 穷人替换多值INSERT:

    INSERT INTO mytable (a,b,c) SELECT 1 a, 2 b, 'x' c 
                      UNION ALL SELECT 2,   5,   'y' 
                      UNION ALL SELECT 3,   7,   'z'
                  ...
    
  • SQLite 3.7.11以来支持真正的多值INSERT:

    INSERT INTO mytable (a,b,c) VALUES (1,2,'x'),
                                       (2,5,'y'),
                                       (3,7,'z');
    
  • 使用交易:

    BEGIN;
    INSERT INTO mytable (a,b,c) VALUES (1,2,'x');
    INSERT INTO mytable (a,b,c) VALUES (2,5,'y');
    INSERT INTO mytable (a,b,c) VALUES (3,7,'z');
    COMMIT;
    

如果你问如何将这些翻译成Ruby或Ruby on Rails - 我承认,我不知道,但我想它应该是可能的。

但是,即使SQLite不支持这些方法,对于内存数据库而言,这一点也不重要 - 因为如果它真的都在内存中,那么插入速度不应该真正取决于您是逐个插入行还是作为一个交易。您的速度限制实际上只是原始内存复制带宽。

答案 1 :(得分:0)

答案 2 :(得分:0)

事实证明,SQLite支持3.7.11的批量INSERT。