domingo, 29 de janeiro de 2012

Armazenar endereços IP como tipos inteiros

Neste artigo irei explicar qual a principal vantagem de armazenarmos endereços IP como tipo inteiro.

Para que você possa entender melhor vamos criar uma tabela simples de forma que possamos armazenar algum endereço IP utilizando o tipo CHAR.

CREATE DATABASE exemplo;
USE exemplo;
CREATE TABLE log(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
                                 usuario CHAR(30), visitas INT, ip CHAR(15)

Vamos inserir alguns registros nesta tabela.

INSERT INTO exemplo VALUES(null, 'douglas', 10, '192.168.10.10');
INSERT INTO log VALUES(null, 'luciana', 10, '200.213.162.161');
INSERT INTO log VALUES(null, 'alberto', 10, '213.187.0.1');

Bem, por enquanto temos tres registros em nossa tabela, começaremos nossa primeira análise.

Qual o tamanho ocupado pela coluna IP ?

Utilizando a função LENGTH do MySQL que nos retorna o tamanho utilizado por cada byte baseado no CHARSET utilizado temos:

SELECT LENGTH(IP) FROM log; ==> 15 bytes

Como resultado a este comando temos um custo total de 15 bytes, como nosso tipo para esta coluna é um CHAR que ocupa uma posição fixa então temos uma utilização de 15 bytes mesmo para um IP 1.1.1.1

Armazenando endereço IP com tipos String teremos um maior custo em disco e mais tempo será preciso para buscar um determinado registro, mas então como podemos economizar utilizando inteiros ?

Em primeiro lugar temos que fazer uma pequena alteração em nossa tabela onde o campo que armazenará o endereço IP seja do tipo UNSIGNED INT

Após esta alteração poderemos utilizar duas funções para armazenar o registro e outra quando precisamos recuper este.

Veja o exemplo:

INET_ATON('192.168.0.1'); ==> 3232235521

SELECT INET_NTOA(3232235521); ==> 192.168.0.1

Nossa tabela desta forma se tornará menos dispendiosa no que se refere ao armazenamento e muito mais rápida ao se procurar por um determinado registro.

Até a próxima.

Nenhum comentário:

Postar um comentário

Observação: somente um membro deste blog pode postar um comentário.