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 / 94222
Accepted
Christopher McGowan
Christopher McGowan
Asked: 2015-03-03 14:03:01 +0800 CST2015-03-03 14:03:01 +0800 CST 2015-03-03 14:03:01 +0800 CST

Tamanho de metadados de linha InnoDB (tamanho mínimo de linha)

  • 772

Estou tentando decidir se devo normalizar mais alguma coisa e preciso saber qual pode ser a menor linha no InnoDB (tenho o MySQL 5.6).

Este não é exatamente o meu caso, mas para simplificar, vamos supor que eu tenha apenas um PK substituto (bigint) e duas colunas TINYINT, nenhuma das quais pode ser nula. Quantos bytes posso esperar que cada linha precise para armazenamento se vou ter 1 bilhão deles?

Eu imagino que cada linha requer alguns metadados (eu sei que requer pelo menos quando há colunas NULLable), mas não consigo encontrar a documentação sobre como calculá-los.

Então, quanto posso esperar ser consumido pelo espaço livre na página e pelos metadados na página (ou isso é tudo junto)?

Eu quero saber para que eu possa julgar melhor quando eu teria uma mesa longa que é estreita o suficiente para evitar a normalização adequada.

mysql innodb
  • 2 2 respostas
  • 550 Views

2 respostas

  • Voted
  1. Best Answer
    akuzminsky
    2015-03-03T14:31:50+08:002015-03-03T14:31:50+08:00

    Cada linha no InnoDB (suponhamos o formato COMPACT) tem estes cabeçalhos:

    • Offsets - um ou dois bytes por campo de tipo de comprimento variável.
    • Flags NULL - um bit por campo NULL, alinhado a um número inteiro de bytes.
    • Os chamados "bytes extras" - um monte de sinalizadores como is_deleted, ponteiro para o próximo registro etc. Cinco bytes em formato COMPACT, fixo.

    Em seguida, vem o(s) campo(s) de chave primária. Em seguida, id de transação de 6 bytes e ponteiro de reversão de 7 bytes. Em seguida, os valores de campo restantes.

    Para a linha fornecida (BIGINT, TINYINT, TINYINT), seu tamanho será:

    • 0 bytes de compensação
    • 0 bytes sinalizadores NULL
    • 5 bytes "Bytes extras"
    • 8 bytes BIGINT
    • 6 bytes trx_id
    • 7 bytes roll_ptr
    • 1 byte TINYINT
    • 1 byte TINYINT

    Portanto, 28 bytes por registro.

    Mas para calcular quanto espaço a mesa vai ocupar você precisa levar em conta:

    • Cabeçalho da PÁGINA (38+56 bytes)
    • trailer da página
    • fator de preenchimento de página
    • registros infinitos, supremos
    • espaço usado por páginas não folheadas

    Verifique estes slides para mais detalhes http://www.slideshare.net/akuzminsky/data-recovery-talk-on-pluk

    • 4
  2. Rick James
    2015-03-03T23:02:44+08:002015-03-03T23:02:44+08:00

    (Estou adicionando uma "resposta", não um comentário por motivos de formatação.)

    @akuzminsky cobriu a maioria das coisas completamente.

    Por que um BIGINT? Um INT UNSIGNED (valor máximo de 4 bilhões) não será suficiente? Isso economizaria 4 GB.

    O fator de preenchimento vem em dois sabores --

    Se as gravações forem feitas corretamente, os blocos estarão 15/16 cheios. O total geral pode ser de 40 a 45 GB

    Se houver INSERTs aleatórios, os blocos estarão em média 69% cheios.

    Agora. vamos perguntar por que esse layout? Os dois TINYINTs serão repetidos muito em um bilhão de linhas. (Em particular, pelo menos 1B/(256*256) = alguns pares serão repetidos pelo menos 4K vezes.) Talvez você possa ter apenas 65K linhas e ter contadores nelas? Talvez alguma outra técnica de resumo funcione para seu aplicativo? (OK, talvez esta mesa seja artificial.)

    BTW, MyISAM levaria 11 GB para os dados dessa tabela (supondo que não haja buracos). Mais outros 15-20 GB para a PRIMARY KEY.

    • 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

    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