Garanta a Eficiência: Escolhendo Sabiamente o Tipo de Dado Integer no MySQL
Published: 2023-07-04 18:16:05


Já pensou no motivo de um banco de dados ter tantos tipos de valores inteiros? SMALLINT? BIGINT? É de comer?

## Conteúdo 

1. [Prólogo](#1)
2. [Escolhendo tipos em modelos de dados](#2)
3. [Tomando uma decisão consciente](#3)
4. [O que posso fazer um Byte ?](#4)
5. [Agora vamos colocar em prática](#5)
6. [Considerações finais](#5)

## 1. Prólogo<a name="1"></a>
Nessa vida de desenvolvedor de software, aprendi a valorizar os fundamentos das tecnologias com as quais trabalho. Neste artigo, vamos explorar todos os tipos **INTEGER** existentes, quais suas características e como podemos usar isso para tomar decisões mais assertivas ao modelar um esquema com **MySQL**.

## 2. Escolhendo tipos em modelos de dados<a name="2"></a>

Um princípio fundamental para modelar dados é avaliar se os tipos escolhidos são os melhores para os valores que serão recebidos. Nesse artigo vamos tentar entender quais tipos de inteiros existem e quais suas diferenças para podermos tomar essa melhor decisão no momento de criar nossas tabelas.

## 3. Tomando uma decisão consciente<a name="3"></a>

Para conseguirmos tomar a decisão mais consciente precisamos saber quais o **tipos de inteiro** existentes e qual o espaço ocupado em **Bytes** por cada tipo, pois independente de você inserir o número inteiro 1 em um registro ele ocupa um espaço diferente de acordo com o tipo de dado do schema.

Por exemplo, o tipo **TINYINT** ocupa `1 byte`, enquanto o tipo **BIGINT** ocupa `8 bytes`. Portanto, mesmo que você insira o número inteiro 1 em um registro, ele ocupará um espaço diferente dependendo do tipo de dado especificado no esquema (schema).

Podemos considerar que cada tipo de inteiros nos permitem armazenar um certo range de valores e cada range reserva uma quantidade de Bytes.

Vamos observar todos os tipos e seus custos de Bytes:

| Type | Storage (Bytes) |
| --- | --- |
| TINYINT | 1  |
| SMALLINT | 2 |
| MEDIUMINT | 3 |
| INT | 4 |

## 4. O que posso fazer um Byte ?<a name="4"></a>

![Ilustração de uma linha com 8 bits](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/749bb223ohee865q06k9.png)


Com 1 Byte podemos usar 8 Bits, ou seja com o **TINYINT** podemos armazenar números no seguinte range: 

```jsx
00000000 = 0
11111111 = 255
```

E caso precisarmos ter um sinal ? Nesse caso vamos precisas separar um bit para isso reduzindo nosso range assim:

```jsx
0 1111111 = -128 (negative bit)
1 1111111 = 127 (positive bit)
```

Com isso temos a seguinte tabela:

| Type | Storage (Bytes) | Min Signed | Max Signed | Min Unsigned | Max Unsigned |
| --- | --- | --- | --- | --- | --- |
| TINYINT | 1  | -128 | 127 | 0 | 255 |
| SMALLINT | 2 | -32768 | 32767 | 0 | 65535 |
| MEDIUMINT | 3 | -8388608 | 8388607 | 0 | 16777215 |
| INT | 4 | -2147483648 | 2147483647 | 0 | 4294967295 |
| BIGINT | 8 | -2^63 | 2^63-1 | 0 | 2^64-1 |

## 5. Agora vamos colocar em prática<a name="5"></a>

```sql
CREATE TABLE `books` (
	`id` bigint NOT NULL AUTO_INCREMENT,
	`title` varchar(100) NOT NULL,
	`num_pages` SMALLINT UNSIGNED, 
	 PRIMARY KEY (id)
);
```
Nesse trecho de SQL, tomamos a decisão de escolher o tipo de inteiro mais adequado com base no contexto do nosso caso de uso. Ao analisar a coluna `num_pages`, que representa o total de páginas de um livro, optamos por utilizar o tipo **SMALLINT**. Essa escolha foi feita levando em consideração os seguintes fatores:

**1. Valor máximo adequado:** O tipo **TINYINT** possui um valor `máximo de 255`, o qual poderia ser facilmente ultrapassado por livros com um número significativo de páginas. No entanto, o tipo **SMALLINT** oferece um tamanho maior, permitindo um valor máximo de 65535. Essa faixa é mais adequada para a representação do número de páginas de um livro na vida real a não ser que você esteja lendo Game of Thrones, ai já seria preciso de um BIGINIT.

**2. Modificador UNSIGNED:** Utilizamos o modificador `UNSIGNED` para indicar que não há necessidade de armazenar valores negativos para o número de páginas de um livro. Isso nos permite aproveitar um limite positivo maior dentro do mesmo tipo de dado, já que não precisamos reservar espaço para o sinal.

Portanto, ao escolher o tipo `SMALLINT UNSIGNED` para a coluna `num_pages`, levamos em consideração o valor máximo adequado, a economia de espaço e a exclusão da possibilidade de valores negativos, garantindo uma representação eficiente e precisa do número de páginas dos livros em nosso sistema.

## 6. Considerações finais<a name="6"></a>

Após compreendermos as diferenças entre os tipos de inteiro, percebi o quanto é importante escolher o tipo de dado adequado para cada situação. Refletindo sobre minha própria experiência, lembro-me das vezes em que utilizei o tipo **INTEGER** desnecessariamente. Após aprofundar-me nesse assunto e compartilhar essas informações, acredito que não vou mais cometer esse erro. Espero que este artigo tenha sido esclarecedor para vocês também, auxiliando na escolha consciente do tipo de inteiro mais adequado para cada contexto.

---

[Venha fazer parte](https://discord.gg/JspQr3GPve) de um ambiente de aprendizado.

![Banner da Hive Community](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b8burs8kanqnoiag1ywf.png)