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 / 3213
Accepted
Incognito
Incognito
Asked: 2011-06-08 06:24:18 +0800 CST2011-06-08 06:24:18 +0800 CST 2011-06-08 06:24:18 +0800 CST

Como devo otimizar o armazenamento para esta tabela?

  • 772

Estou usando o MySql para armazenar uma tabela básica deste formato:

    id      int(11)          //Auto-Incrementing ID
    data    varchar(5120)    //Random input data, compressed by a program, not mysql.
    -----------------------
    Row size ø  916 B

Isso é um pouco preocupante, porque agora tenho cerca de 5.000 registros por mês e gostaria de otimizar isso melhor do que acabar com uma média de 1 MB/1.000 registros.

Eu configurei dessa forma originalmente porque queria capturar os conjuntos maiores, mas eles são muito raros, como você pode ver aqui neste gráfico:

insira a descrição da imagem aqui

Link para a API do gráfico

count   n*128 bytes
+-------+----------
1       28
1       26
1       24
2       22
8       21
4       20
13      19
12      18
16      17
27      16
43      15
58      14
69      13
114     12
184     11
262     10
399     9
588     8
807     7
1224    6
1245    5
546     4
73      3
9       2
6       1
1       0

Minha principal preocupação aqui é quanto espaço desperdicei apenas para acomodar o final desse gráfico, e o que acontece quando acabo com outliers ainda maiores? Terei que aumentar meu tamanho de linha novamente, quando aproximadamente 80% dos dados se encaixam muito bem em um bloco varchar 1024, 1/5 do tamanho do que estou usando agora.

Então, como eu deveria ter construído essa coisa em primeiro lugar?

mysql optimization
  • 2 2 respostas
  • 296 Views

2 respostas

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2011-06-08T08:42:04+08:002011-06-08T08:42:04+08:00

    Como já está construído, vamos ver o que você tem. Existe uma maneira interessante de planejar definições de colunas para dados atualmente presentes. Se o nome da tabela for mydata, tente executar esta consulta:

    SELECIONE dados DE mydata PROCEDURE ANALYZE ();

    Isso não exibirá nenhum dos seus dados. Isso examinará a dataprópria coluna, calculará as estatísticas com base nos primeiros 256 valores distintos (por padrão, você pode especificar a contagem de valores distintos) e recomendará o tipo de coluna adequado que a tabela deve ter.

    Desde que a tabela seja MyISAM, não se preocupe muito com o tamanho das linhas porque o formato de linha padrão é DYNAMIC. Se a tabela for InnoDB (e espero que não seja), verifique se os dados não fazem parte da PRIMARY KEY. Seu índice agrupado crescerá como derramar MiracleGro não diluído em seu quintal.

    Pode ser necessário dividir a coluna de dados em blocos de 128 e executar MD5 (saída de 32 caracteres) ou SHA1 (saída de 40 caracteres), concatenar essas saídas MD5 ou SHA1 e armazená-las. Isso economizaria 75% de armazenamento. Divirta-se tentando codificar essa separação. Esta foi apenas uma sugestão divagar em cima da minha cabeça.

    Você pode querer considerar o uso do Sphinx Indexing também.

    • 4
  2. Rick James
    2011-06-09T16:24:40+08:002011-06-09T16:24:40+08:00

    Para MyISAM, se você nunca ATUALIZAR ou EXCLUIR registros, um registro com N bytes para o blob ocupará N+8 bytes no arquivo .MYD.

    O MyISAM PK será encontrado no arquivo .MYI; será bem pequeno - cerca de 11 bytes/linha, mais um pouco de sobrecarga, arredondado para blocos de 1 KB.

    Se você estiver usando o InnoDB, o layout é bastante complicado. Existem blocos de dados de 16KB que nunca estão totalmente cheios, existem extensões de blob (mesmo para VARCHAR), que entram em ação após 767 bytes (talvez antes, dependendo da versão), etc. As extensões são alocadas em blocos de 1 MB. Planeje algo como 2N bytes por média de linha.

    O InnoDB PK é armazenado com os dados, por isso está completamente incluído acima. E, sendo AUTO_INCREMENT, seus blocos tenderão a ficar relativamente cheios. Nota: os blocos têm 16 KB de tamanho, permitindo pelo menos 20 por bloco.

    Não jogue jogos com sua própria divisão; isso tornará as coisas mais lentas, complicará seu código, etc. O disco é barato. (Sim, é divertido jogar esses jogos.)

    Parece que metade dos seus registros não passará do limite 767.

    Um aparte: se o blob for um dado compactado, você realmente deve usar o BLOB, não o VARCHAR. VARCHAR assume atributos CHARACTER SET, o que realmente o queimaria se você mudasse para utf8. Se você precisar usar VAR-xx, use VARBINARY.

    • 2

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