Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

BLOB vs. VARCHAR para armazenar arrays em uma tabela MySQL


Existe uma razão para você não criar uma tabela filha para poder armazenar um valor de ponto flutuante por linha, em vez de uma matriz?

Digamos que você armazene mil matrizes de 300 elementos cada por dia. São 300.000 linhas por dia, ou 109,5 milhões por ano. Nada para desprezar, mas dentro das capacidades do MySQL ou qualquer outro RDBMS.

Re seus comentários:

Claro, se o pedido for significativo, você adiciona outra coluna para o pedido. Veja como eu projetaria a mesa:
CREATE TABLE VectorData (
  trial_id INT NOT NULL,
  vector_no SMALLINT UNSIGNED NOT NULL,
  order_no SMALLINT UNSIGNED NOT NULL,
  element FLOAT NOT NULL,
  PRIMARY KEY (trial_id, vector_no),
  FOREIGN KEY (trial_id) REFERENCES Trials (trial_id)
);

  • Espaço total para uma linha de dados vetoriais:300x(4+2+2+4) =3600 bytes. Além disso, o diretório de registros do InnoDB (coisas internas) de 16 bytes.

  • Espaço total se você serializar um array Java de 300 floats =1227 bytes?

Assim, você economiza cerca de 2.400 bytes, ou 67% do espaço, armazenando o array. Mas suponha que você tenha 100 GB de espaço para armazenar o banco de dados. Armazenar uma matriz serializada permite armazenar 87,5 milhões de vetores, enquanto o design normalizado permite armazenar apenas 29,8 milhões de vetores.

Você disse que armazena algumas centenas de vetores por dia, então você preencherá essa partição de 100 GB em apenas 81 anos, em vez de 239 anos.

Re seu comentário:Desempenho de INSERT é uma questão importante, mas você está armazenando apenas algumas centenas de vetores por dia.

A maioria dos aplicativos MySQL pode atingir centenas ou milhares de inserções por segundo sem feitiçaria excessiva.

Se você precisa de um desempenho ideal, aqui estão algumas coisas a serem observadas:
  • Transações explícitas
  • Sintaxe INSERT de várias linhas
  • INSERT DELAYED (se você ainda usa MyISAM)
  • CARREGAR INFIL DE DADOS
  • ALTER TABLE DISABLE KEYS, faça as inserções, ALTER TABLE ENABLE KEYS

Procure a frase "inserções mysql por segundo" em seu mecanismo de busca favorito para ler muitos artigos e blogs falando sobre isso.