gpt4 book ai didi

ruby-on-rails - 轻量级内存数据库

转载 作者:行者123 更新时间:2023-12-03 18:59:01 25 4
gpt4 key购买 nike

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

一目了然,SQLite 满足了我们的所有需求。可以简单地建立到内存中 SQLite DB 的连接:

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

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

不久前,当我们发现需要将数据批量加载(特别是批量插入)到 SQLite 表中时,我们开始研究一些性能问题(参见 these 基准测试)。

不幸的是,SQLite 似乎不支持批量插入。

所以 是否还有其他基于 SQL 的轻量级内存数据库,支持批量插入 ?

如果没有—— 有没有办法利用重量级数据库如 PostreSQL(MySQL 或任何其他主要参与者)作为内存数据库 ?

如果 postresql/mysql 不是一种可行的方法 - 是否有任何其他 C 高度优化的数据结构与查询语言之上? (有/没有 ruby 绑定(bind))。

最佳答案

首先,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 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 不支持这些方法,对于内存数据库来说,这一切都不重要 - 因为如果它真的全部在内存中,插入速度不应该真正取决于您是逐个插入行还是作为一个事务插入.您的速度限制实际上只是原始内存复制带宽。

    关于ruby-on-rails - 轻量级内存数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14508502/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com