AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 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

Qual banco de dados para armazenar 20 bilhões de linhas

  • 772

Pretendo arquivar mensagens e não tenho certeza de qual devo usar.

Deve ser capaz de conter no máximo 20 bilhões de linhas (é para isso que espero que o número total tenda)

Cada linha terá três colunas: user_id, mensagem, data

O user_id é uma sequência de 30 caracteres. A mensagem tem entre 1 e 20.000 caracteres. Em média, espero que tenha 140 caracteres. (UTF-8, deve permitir emojis, alfabetos diferentes, etc)

Quero apenas um índice para o user_id, não para a mensagem/data.

Eu só pretendo fazer consultas INSERT, e muito simples SELECT * WHERE user_id = XXXXX Haverá muito poucos SELECTs, espero no pico de 10/minuto. Os SELECTs não precisam ser rápidos, qualquer coisa entre 1 e 20 segundos está bom.

Mas haverá muitos INSERTs. Provavelmente cerca de 5.000-10.000 por segundo.

Meu servidor terá: CPU: AMD Ryzen™ 9 7950X3D RAM: 128 GB DDR5 ECC Drives: 1x 7,68 TB NVMe SSD Datacenter (da Hetzner)

database-recommendation
  • 2 2 respostas
  • 109 Views

2 respostas

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

    Vamos contar 180 bytes por mensagem (incluindo user_id, timestamp e overhead), com 20B de mensagens que equivalem a 3,6 Tb, um pedaço de dados já bastante substancial.

    Eu só pretendo fazer consultas INSERT e muito simples SELECT * WHERE user_id = XXXXX

    Para evitar E / S aleatória, eu preferiria um banco de dados que pudesse agrupar linhas com as mesmas chaves de índice (neste caso, user_id) juntas no armazenamento. Isso irá acelerar seus SELECTs, e se você ordenar por (user_id,timestamp) enquanto os dados já estão armazenados nessa ordem, nenhuma classificação será necessária.

    O Postgresql exigiria um índice extra que duplicaria os dados.

    O InnoDB no MySQL/MariaDB agrupa automaticamente com base na chave primária, portanto, se você definir (user_id,timestamp) como PK, essa condição será atendida. O InnoDB também oferece suporte à compactação de páginas com algoritmos modernos como lz4. Se possível, ao inserir um lote de linhas, você deve ordená-las por chave primária . Todo mundo conhece MySQL, então não vou entrar em detalhes.

    Outra opção seria Clickhouse . Embora fale SQL, não é exatamente um banco de dados relacional como os habituais. Por exemplo, não faz UPDATEs ou chaves estrangeiras. Destina-se ao OLAP/data warehouse, que é o que você está fazendo. Ele atende a ambas as condições: usando o mecanismo MergeTree , os dados são armazenados automaticamente na ordem especificada para serem agrupados e suportam compactação. É um pouco meticuloso e difícil de configurar. O desempenho geralmente é ridículo se você o usar para o que deveria fazer. Vamos tentar uma consulta muito idiota:

    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.)
    

    Quanto aos INSERTs, você deve fazer cerca de 1 a 10 por segundo, em massa. Além disso, nunca é uma boa ideia fazer milhares de instruções INSERT por segundo quando você pode fazer apenas uma com todas as linhas agrupadas. A interface python suporta inserções em massa com arrays. Exemplo:

    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
    

    Estatísticas de compressão:

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

    Nesse exemplo simples, obtemos 2,6 milhões de linhas inseridas por segundo com uma taxa de compactação de cerca de 5 neste texto reconhecidamente fácil de compactar. O Python maximizou um núcleo para 37,5s enviando os dados, enquanto o banco de dados usou 21s de tempo de CPU. Basicamente, não estava fazendo muito e o restante dos núcleos estava ocioso.

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

    Qual banco de dados para armazenar 20 bilhões de linhas

    Qualquer.

    A maioria dos sistemas de banco de dados modernos não possui limite de dados por contagem de linhas. O tamanho dos dados em repouso não afeta o desempenho.

    Você tem um esquema muito simples e definido. Você também tem casos de uso muito simples. Provavelmente qualquer RDBMS moderno seria uma boa escolha. Se você deseja um com muito suporte e recursos ao usuário e ao mesmo tempo gratuito, o PostgreSQL é uma ótima escolha. Se software pago e de nível empresarial estiver disponível, o SQL Server também é uma excelente escolha. Outras boas opções são MariaDB, Oracle SQL e MySQL.

    FWIW, já trabalhei com armazenamento de grandes quantidades de Messagedados (especificamente mensagens de email) em um RDBMS (SQL Server) no passado. A tabela principal tinha dezenas de bilhões de linhas e estávamos inserindo milhares de linhas por segundo, durante tempos de pico elevados. Consultar pequenas quantidades de dados dessa tabela também foi rápida (menos de um segundo). O hardware por trás do servidor foi muito menos provisionado do que você planeja usar.

    • 1

relate perguntas

  • Um banco de dados para ativos digitais

  • Quaisquer motivos *não* para usar o MySQL neste cenário

  • Proxy orientado a objetos de vários bancos de dados

  • Quais mecanismos de banco de dados me permitirão GRANT/REVOKE em uma coluna específica?

  • Quais bancos de dados são recomendados para serem usados ​​como bancos de dados integrados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

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

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve