TransWikia.com

Espaço ocupado entre diferentes tipos de inteiros

Stack Overflow em Português Asked on December 14, 2021

Pela tabela da documentação oficial MySQL, e uma pergunta aqui no SOpt, me surgiu uma dúvida.

Considerando a tabela:

Type Storage
(Bytes)
Minimum
Value
Signed
Minimum
Value
Unsigned
Maximum
Value
Signed
Maximum
Value
Unsigned
TINYINT 1 -128 0 127 255
SMALLINT 2 -32768 0 32767 65535
MEDIUMINT 3 -8388608 0 8388607 16777215
INT 4 -2147483648 0 2147483647 4294967295
BIGINT 8 -263 0 263-1 264-1

Vamos supor que vou usar um TINYINT e um BIGINT para armazenar o mesmo valor (ex.: 240).


Pergunto:

  • Ele não "reserva" todos os bytes para aquele registro (seria dinâmico o espaço ocupado)?
  • Se dinâmico, teriam os 2 o mesmo tamanho em espaço em disco?
  • Se não "reserva" esse espaço, como ele "aumenta" depois?
  • Isso muda de banco para banco?

3 Answers

Dados numéricos possuem espaço fixo sempre, quando você escolhe o tipo está determinando quanto de espaço ocupará na linha daquela tabela, não muda. E a tabela apresentada está mostrando isso. É igual em qualquer linguagem.

Então se você disse que quer um BIGINT ele ocupará 8 bytes, mas que pode armazenar algo que caiba em um tipo menor. É como em uma folha de papel, o espaço para colocar vários dígitos está lá, se você não usar todo espaço é problema seu. Se sempre não usar, provavelmente escolheu o tipo errado. Se tiver um número que não cabe no espaço também escolheu errado, dará erro tentar pôr lá.

VARCHAR é outra coisa, aí é um dado inerentemente variável. O que estamos falando aqui vai mais na linha do CHAR que tem o tamanho definido na sua declaração da estrutura da tabela. Só lembrando que o CHAR você define quantos caracteres terão naquela coluna, e aí não muda, se falar que é 10, será sempre 10, mesmo que não não use todos. E por isso talvez as pessoas acham que o SMALLINT(3) tem a ver com caracteres, e é outra coisa completamente diferente, os números tem o espaço alocado definido independente desse número nos parênteses.

Não é assim em todos os banco de dados, o SQLite por exemplo só tem o INT, e o tamanho ocupado varia de acordo com a precisão que o número exige. Ocupa de 1 byte (se não for nulo) até 9 bytes (cada byte extra adiciona uma multiplicação de 128 já que 1 bit é usado para informar se tem um novo byte apara avaliar, a não ser o nono byte que, se existir, pode multiplicar os 256 possíveis de um byte, o que faria ter 8 bytes úteis e um que é a soma do bits de controle.

Há reserva de todos os bytes, ainda não entendi porque pode dar a percepção contrária se a tabela apresentada deixa isso claro. E ainda não entendi se algumas das demais perguntas fazem sentido.

Mas nada impediria ser diferente, como é em alguns banco de dados. Em geral as linhas podem ter tamanhos diferentes por causa do VARCHAR ou algum tipo de BLOB, se o número também for assim, nada muda, em muitos casos, pode ser vantajoso. Pense em uma linha como se fosse sempre um VARCHAR que tem vários segmentos (um BLOB seria até melhor), e de fato internamente costuma ser tratado assim, há um chave, geralmente o ID e um valor (key-value) que seria esse BLOB. Já em um índice o par o que se chama chave é a chave que todo conhece e o valor é o ID ou outra PK da tabela.

Answered by Maniero on December 14, 2021

Realmente, eu acabei de responder no tópico que citou algo neste sentido. Se fixar o tamanho, é memória que será utilizada, mesmo sem uso. Gera uma facilidade para a pesquisa, melhorando performance (pois não precisa mapear os campos antes de retornar). Quanto a ficar 'quebrado', fica como se fossem campos em branco para a memória, para preencher aquele espaço, diferente do dinâmico que vai alocando conforme a necessidade.

Answered by Bruno Martins on December 14, 2021

No caso dos ints, todo o espaço da variável int é alocado mesmo que o valor dela seja 1 ou 100. Existem até mesmo setores em grandes desenvolvedores que avaliam qual é a forma mais viável de declarar os tipos de campos em um banco de dados para maximizar a economia de espaço em disco.

Answered by adrianosmateus on December 14, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP