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:
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
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP