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

SQLite一目了然,满足了我们的所有需求。建立与内存中SQLite数据库的连接可以很简单:

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

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


不久前,我们开始研究一些性能问题,结果表明我们需要将数据批量加载(特别是批量INSERT)到我们的SQLite表中(请参见these基准)。

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

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

如果没有,那么是否有办法将诸如PostreSQL(MySQL或其他主要播放器)之类的重量级数据库用作内存数据库?

如果postresql / mysql不可行,是否还有其他C语言高度优化的数据结构以及查询语言呢? (有/没有红宝石装订)。

最佳答案

首先,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'
              ...

真正的多值INSERT,从SQLite 3.7.11开始受支持:

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不支持这些方法,对于内存数据库也不重要,因为这确实是所有内存,插入速度实际上并不取决于您是逐行插入还是作为一个事务插入。您的速度限制实际上只是原始内存复制带宽。

10-05 22:42
查看更多