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 / 4892
Accepted
George Edison
George Edison
Asked: 2011-08-22 12:59:50 +0800 CST2011-08-22 12:59:50 +0800 CST 2011-08-22 12:59:50 +0800 CST

Quais são as possíveis considerações e desvantagens de armazenar dados de imagens binárias diretamente em uma tabela?

  • 772

Embora relacionado a esta questão, tenho um ângulo ligeiramente diferente para abordar esta questão. Aqui está a minha situação:

Estou escrevendo um aplicativo da Web (em PHP ou Python) que gerencia complementos para um aplicativo de desktop. Os usuários podem procurar complementos, instalá-los, carregá-los, etc.

Estou planejando o esquema para o banco de dados e me deparei com uma decisão a tomar:

É melhor armazenar ícones (para os complementos) na própria tabela ou, em vez disso, armazená-los no sistema de arquivos e simplesmente armazenar um nome de arquivo na tabela?

Os ícones são pequenos (48x48 ou próximo disso) e provavelmente não ocuparão mais do que 5 ou 6 KB no máximo. Há alguma desvantagem séria em armazenar os dados da imagem na tabela? Existem outras implicações das quais eu deveria estar ciente? O desempenho será uma preocupação? O armazenamento será um problema?


Edit: Atualmente, estou olhando para tabelas MyISAM em um banco de dados MySQL.

mysql schema
  • 2 2 respostas
  • 1423 Views

2 respostas

  • Voted
  1. Best Answer
    Mark Storey-Smith
    2011-08-22T14:41:34+08:002011-08-22T14:41:34+08:00

    Você não especificou a plataforma de banco de dados que está considerando, mas neste tamanho/escala, é improvável que faça diferença.

    5kb por registro é trivial. 1 milhão de registros de 5 KB é < 5 GB, ainda trivial. 10 milhões de registros de 5kb... ainda não é algo para perder o sono.

    Se quiséssemos obter uma plataforma específica, um white paper normalmente exaustivamente pesquisado por Paul Randall sobre o armazenamento de fluxo de arquivos do SQL Server sugere que ele supera o armazenamento de tabelas em que os arquivos têm 1 MB ou mais. Tamanhos de arquivo abaixo de 1 MB, os pontos positivos são principalmente em torno do fluxo de arquivos ignorando o buffer pool.

    Os pontos positivos para armazenamento de banco de dados:

    1. Transacionado. Os dados binários estão vinculados aos seus metadados, não expostos por um sistema de arquivos, protegidos contra exclusão acidental.
    2. Redução da sobrecarga de backup. 1 milhão de registros em um arquivo de 5 GB versus 1 milhão de arquivos de 5 KB.
    3. O companheiro natural para 2), restauração mais rápida.

    Edit: Os negativos (como sugerido por Aaron)

    1. Requer acesso programático.
    2. Custo de armazenamento. Mais um problema se você tiver que lidar com restrições de tamanho de plataforma, por exemplo, 50 GB no Azure.
    • 4
  2. RolandoMySQLDBA
    2011-08-23T08:49:49+08:002011-08-23T08:49:49+08:00

    Outro aspecto interessante que torna o armazenamento de dados de imagem bastante desafiador é ter o tamanho de pacote correto. Falei sobre isso em 27 de abril de 2011 .

    Como as imagens devem ser armazenadas em campos BLOB, haverá operações internas e/ou comunicações externas de dados BLOB por meio de programas (como mysqldump), infraestrutura (como MySQL Replication) e uso de consulta geral (como ter dados BLOB em tabelas temporárias internas durante JOINs e avaliação da cláusula WHERE).

    Além disso, conforme mencionado na URL anterior, o mecanismo de armazenamento InnoDB tem uma maneira de lidar com pacotes na memória e arquivos de log.

    Não deve ser esquecido é construir consultas SQL que

    • evite executar quaisquer cláusulas WHERE contra os dados BLOB
    • mantenha os dados BLOB fora do maior número possível de tabelas temporárias (pode exigir consultas de refatoração)

    À luz desses fatos, você terá que configurar my.cnf com um número para max_allowed_packet para que um único pacote MySQL seja grande o suficiente para acomodar múltiplos BLOBs. Você também deve procurar ter RAM disponível suficiente no servidor de banco de dados. Caso contrário, lidar com BLOBs em massa, movendo constantemente um único BLOB para dentro e para fora de um pacote, produzirá gargalos de desempenho inesperados.

    CONCLUSÃO

    A maioria das considerações/desvantagens devem se anular uma vez que você tenha RAM disponível suficiente, pacotes MySQL de tamanho adequado e consultas que evitem o acúmulo de dados BLOB em várias tabelas temporárias.

    ATUALIZAÇÃO 2011-09-09 12:23 EDT

    Outra consideração é lembrar de usar a opção --hex-blob no mysqldump. Caso contrário, pode tornar as coisas um pouco difíceis de recarregar o blob, dependendo de certas sequências de caracteres.

    • 1

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

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

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

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

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

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 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
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +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