Digamos que eu tenha a seguinte tabela:
CREATE TABLE `my_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`relationship_status` varchar(48) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1
e digamos que esta tabela tenha muitos registros: 100M
Eu tenho 2 valores possíveis para relationship_status
: 'following' ou 'not_following'
já que eu quero reduzir o tamanho do banco de dados (tamanho no disco rígido), como isso afetaria se eu mudasse relationship_status
para Boolean em vez de varchar(48) (onde if pode definir 0 como não seguinte e 1 como seguinte)?
qual tipo de coluna você usaria? minúsculoint?
Acho que
TINYINT
seria uma boa escolha. Eu sugeriria não indexarrelationship_status
nada. Você não deve indexarrelationship_status
sozinho porque a cardinalidade do índice é 2. O Query Optimizer nunca usaria o índice. Você poderia indexar da seguinte forma:Dessa forma, no pior caso, o Query Optimizer executaria uma varredura de índice em consultas como:
O plano EXPLAIN deve ser melhorado para que a classificação e o uso da tabela temporária sejam minimizados ou eliminados.
Agora com relação ao espaço em disco, vamos calcular a economia de espaço. Primeiro, qual é o comprimento de cada string?
Cada VARCHAR possui um byte adicional para rastrear o comprimento da string. Os valores são realmente 10 e 14. Isso é ignorado, pois você está reduzindo o campo para 1 byte. Se você
relationship_status
reduzir para TINYINT, a economia será a seguinteComo o número de linhas é de cerca de 100 milhões, a economia de espaço em disco deve estar entre 900 milhões e 1,3 G.
ATUALIZAÇÃO 2012-08-23 13:00 EDT
Para responder ao seu comentário
Em primeiro lugar, a
DATETIME
tem 8 bytes eINT(11)
tem 4 bytes. Como 8 - 4 = 4, sua economia seria de 4 bytes por linha. Para a mesa,SELECT COUNT(1)*4 FROM my_table;
Agora, o campo varchar(255). Como mencionei antes, um varchar tem um byte extra para gerenciamento de comprimento. Some todos os comprimentos de todos os campos varchar e adicione a contagem de linhas (o campo from extra em cada linha) e subtraia 4 bytes vezes a contagem de linhas.
Colocando os cálculos DATETIME e VARCHAR juntos, você obtém isso
Pessoalmente, eu usaria um tipo de dados BIT(1) e alteraria o nome da coluna para "following" apenas para que fizesse sentido lógico.
O espaço usado pelo seu design atual é o seguinte (usando o comprimento do texto NOT_FOLLOWING que é de 13 bytes):
Usar um campo de bit usaria o seguinte espaço:
Isso lhe daria uma economia de espaço de:
Espero que isso ajude você.