AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 333499
Accepted
lyeaf
lyeaf
Asked: 2023-11-28 02:59:47 +0800 CST2023-11-28 02:59:47 +0800 CST 2023-11-28 02:59:47 +0800 CST

什么数据库可以存储20~十亿行

  • 772

我计划归档邮件,但不确定应该使用哪个。

它应该能够容纳最多 200 亿行(这就是我期望的总数)

每行将包含三列:user_id、消息、日期

user_id 是一个 30 个字符的字符串。该消息的长度介于 1 - 20 000 个字符之间。我预计平均为 140 个字符。(UTF-8,它应该允许表情符号、不同的字母表等)

我只想要 user_id 的索引,而不是消息/日期的索引。

我只计划进行 INSERT 查询,并且非常简单 SELECT * WHERE user_id = XXXXX 会有很少的 SELECT,我预计峰值为 10 个/分钟。SELECT 不需要太快,1 到 20 秒之间的任何时间都可以。

但是会有很多INSERT。大概每秒5000-10000次。

我的服务器将配备: CPU:AMD Ryzen™ 9 7950X3D RAM:128 GB DDR5 ECC 驱动器:1x 7.68 TB NVMe SSD 数据中心(来自 Hetzner)

database-recommendation
  • 2 2 个回答
  • 109 Views

2 个回答

  • Voted
  1. Best Answer
    bobflux
    2023-11-28T08:53:25+08:002023-11-28T08:53:25+08:00

    我们来算一下每条消息有 180 字节(包括 user_id、时间戳和开销),其中 20B 条消息相当于 3.6 Tb,已经是相当大的数据块了。

    我只计划进行 INSERT 查询,以及非常简单的 SELECT * WHERE user_id = XXXXX

    为了避免随机 IO,我更喜欢可以将具有相同索引键(在本例中为 user_id)的行在存储中紧密聚集在一起的数据库。这将加快您的 SELECT 速度,如果您按 (user_id,timestamp) 排序,而数据已按该顺序存储,则不需要排序。

    Postgresql 需要一个额外的索引来重复数据。

    MySQL/MariaDB 上的 InnoDB 自动根据主键进行集群,因此如果将 (user_id,timestamp) 定义为 PK,则满足该条件。InnoDB 还支持使用 lz4 等现代算法进行页面压缩。如果可能,在插入一批行时,应按主键对它们进行排序。MySQL大家都知道,我就不多说了。

    另一个选择是Clickhouse。虽然它使用 SQL,但它并不完全像通常的关系数据库。例如,它不执​​行更新或外键。它适用于 OLAP/数据仓库,这正是您正在做的事情。它确实满足这两个条件:使用MergeTree引擎,数据会自动按照您指定的顺序存储,因此它将被聚类,并且它支持压缩。它有点挑剔并且难以配置。如果你将它用于它应该做的事情,那么性能通常是荒谬的。让我们尝试一个非常愚蠢的查询:

    SELECT max(value) FROM mqtt_store;
    ┌──max(value)─┐
    │ 25378554360 │
    └─────────────┘
    1 row in set. Elapsed: 1.614 sec. 
    Processed 1.41 billion rows, 11.25 GB (871.46 million rows/s., 6.97 GB/s.)
    

    至于 INSERT,您应该每秒执行大约 1-10 次批量操作。此外,当您只能对所有行进行分组时,每秒执行数千个 INSERT 语句绝不是一个好主意。python 接口支持数组的批量插入。例子:

    CREATE TABLE foo
    (
        `id` Int32 NOT NULL CODEC(Delta, LZ4),
        `x` String CODEC(LZ4)
    )
    ENGINE = MergeTree PRIMARY KEY (x, y)
    
    python
    
    x = list(range(100000000))                                                        
    y = ["Hello I am number %d"%_ for _ in x]                                             
    t=time.time(); clickhouse.execute("INSERT INTO foo VALUES", (x,y), columnar=True); time.time()-t
    37.523436546325684
    

    压缩统计:

    ┌─name─┬─compression_codec────┬─uncompressed─┬─compressed─┬─ratio─┐
    │ x    │ CODEC(Delta(4), LZ4) │    404000044 │   25015435 │  16.2 │
    │ y    │ CODEC(LZ4)           │   2713777985 │  518720198 │   5.2 │
    └──────┴──────────────────────┴──────────────┴────────────┴───────┘
    

    在这个简单的例子中,我们每秒插入 260 万行,对于这个公认易于压缩的文本,压缩比约为 5。Python 最多使用一个核心 37.5 秒发送数据,而数据库使用了 21 秒的 CPU 时间。基本上,它没有做太多事情,其余的核心都在闲置。

    • 3
  2. J.D.
    2023-11-28T04:08:22+08:002023-11-28T04:08:22+08:00

    什么数据库可以存储20~十亿行

    任何。

    大多数现代数据库系统没有行数的数据限制。静态数据的大小不会影响性能。

    您有一个非常简单且已定义的架构。您还有非常简单的用例。因此,任何现代 RDBMS 都可能是一个不错的选择。如果您想要一个具有大量用户支持和功能且免费的产品,那么 PostgreSQL 是一个不错的选择。如果可以使用付费的企业级软件,SQL Server 也是一个很好的选择。其他不错的选择包括 MariaDB、Oracle SQL 和 MySQL。

    MessageFWIW,我过去曾在 RDBMS (SQL Server) 中存储大量数据(特别是电子邮件消息)。主表有数十亿行那么大,在高峰时段我们每秒插入数千行。从该表中查询少量数据也很快(不到一秒)。服务器背后的硬件配置也比您计划使用的要少得多。

    • 1

相关问题

  • 数字资产数据库

  • 在这种情况下完全*不*使用 MySQL 的任何理由

  • 多数据库面向对象代理

  • 哪些数据库引擎允许我对特定列进行 GRANT/REVOKE?

  • 推荐使用哪些数据库作为嵌入式数据库?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve