Nesta postagem do blog, discutiremos um dos recursos mais usados do MySQL - partições.
O que é particionamento?
No MySQL, o particionamento é uma técnica de projeto de banco de dados na qual um banco de dados divide os dados em várias tabelas, mas ainda trata os dados como uma única tabela pela camada SQL. Simplificando, quando você particiona uma tabela, você a divide em várias subtabelas:o particionamento é usado porque melhora o desempenho de determinadas consultas, permitindo que elas acessem apenas uma parte dos dados, tornando-as mais rápidas. As operações de E/S também podem ser aprimoradas porque os dados e os índices podem ser divididos em vários volumes de disco.
Existem dois tipos de particionamento:horizontal e vertical. O particionamento horizontal envolve colocar linhas diferentes em tabelas diferentes, o particionamento vertical, por outro lado, envolve a criação de tabelas com menos colunas e o uso de tabelas adicionais para armazenar as colunas restantes.
Como funciona o particionamento?
- Quando consultas SELECT são usadas, a camada de particionamento abre e bloqueia partições, o otimizador de consulta determina se alguma das partições pode ser removida e, em seguida, a camada de particionamento encaminha as chamadas da API do manipulador para o mecanismo de armazenamento que trata as partições.
- Quando consultas INSERT são usadas, a camada de particionamento abre e bloqueia partições, determina a qual partição a linha deve pertencer e encaminha a linha para essa partição.
- Quando consultas DELETE são usadas, a camada de particionamento abre e bloqueia partições, determina qual partição contém a linha e exclui a linha dessa partição.
- Quando consultas UPDATE são usadas, a camada de particionamento abre e bloqueia partições, descobre qual partição contém a linha, busca a linha e a modifica, então determina qual partição deve conter a nova linha, encaminha a linha para a nova partição com uma solicitação de inserção e, em seguida, encaminha a solicitação de exclusão para a partição original.
Quando você deve usar o particionamento?
Em geral, o particionamento é útil quando:
- Você tem muitos dados que precisa consultar.
- Suas tabelas são muito grandes para caber na memória.
- Suas tabelas contêm dados históricos e novos dados são adicionados à partição mais recente.
- Você acha que precisará distribuir o conteúdo de uma tabela em diferentes dispositivos de armazenamento.
- Você acha que precisará restaurar partições individuais.
Se um ou mais dos cenários descritos acima descrevem sua situação, o particionamento pode ajudar. Antes de particionar seus dados, lembre-se de que as partições do MySQL têm suas próprias limitações:
- As expressões de particionamento não permitem o uso de procedimentos armazenados, funções armazenadas, funções definidas pelo usuário (UDFs) ou plugins e com suporte limitado para funções SQL. Você também não pode usar variáveis declaradas ou armazenadas.
- As tabelas particionadas não podem conter ou ser referenciadas por chaves estrangeiras.
- Há um limite de 1.024 partições por tabela (a partir do MariaDB 10.0.4, as tabelas podem conter no máximo 8.192 partições).
- Uma tabela só pode ser particionada se o mecanismo de armazenamento oferecer suporte a particionamento.
- O cache de consulta não está ciente de particionamento ou remoção de partição.
- Todas as partições devem usar o mesmo mecanismo de armazenamento.
- Os índices FullTEXT não são suportados
- Tabelas temporárias não podem ser particionadas
As opções acima devem ajudá-lo a decidir se o particionamento é uma opção para você ou não.
Tipos de particionamento
Se você decidir usar partições, tenha em mente que você tem vários tipos de particionamento para escolher. Abordaremos brevemente suas opções abaixo e, em seguida, nos aprofundaremos nelas:
- O particionamento por RANGE pode ajudar você a particionar linhas com base em valores de coluna dentro de um determinado intervalo.
- O particionamento por LIST pode ajudá-lo a particionar linhas com base na associação de valores de coluna em uma determinada lista.
- O particionamento por HASH pode ajudar você a particionar linhas com base em um valor retornado por uma expressão definida pelo usuário.
- Particionar por KEY pode ajudá-lo a particionar linhas com base em uma função de hash fornecida pelo MySQL.
Particionamento por RANGE
Particionar por RANGE é uma das formas mais populares de particionar tabelas MySQL. Ao particionar uma tabela por RANGE, você particiona a tabela de tal forma que cada partição contém um certo número de linhas que se enquadram em um determinado intervalo. Para definir uma partição, defina o nome dela e diga quais valores ela deve conter - para particionar uma tabela por intervalo, adicione uma instrução PARTITION BY RANGE. Por exemplo, se você quiser nomear sua partição p0 e fazer com que ela contenha todos os valores menores que 5, você precisará certificar-se de que sua consulta contenha PARTITION p0 VALUES LESS THAN (5). Aqui está um exemplo de uma tabela particionada:
CREATE TABLE sample_table (
id INT(255) NOT NULL AUTO_INCREMENT PRIMARY KEY,
column_name VARCHAR(255) NOT NULL DEFAULT ‘’
...
) PARTITION BY RANGE (column_name) (
PARTITION p0 VALUES LESS THAN (5),
PARTITION p1 VALUES LESS THAN (10),
PARTITION p2 VALUES LESS THAN (15),
PARTITION p3 VALUES LESS THAN (20),
...
);
Você também pode definir uma partição que contém todos os valores que não se enquadram em determinados intervalos, assim:
PARTITION p5 VALUES LESS THAN MAXVALUE
A partição acima é denominada p5 e contém todos os valores que outras partições não possuem - MAXVALUE representa um valor que é sempre maior que o maior valor possível. Você também pode usar funções definindo suas partições assim:
PARTITION BY RANGE (YEAR(date)) (
PARTITION p0 VALUES LESS THAN (2000),
PARTITION p1 VALUES LESS THAN (2010),
PARTITION p2 VALUES LESS THAN (2020),
PARTITION p3 VALUES LESS THAN MAXVALUE
);
Neste caso, todos os valores inferiores a 2000 são armazenados na partição p0, todos os valores inferiores a 2010 são armazenados na partição p1, todos os valores inferiores a 2020 são armazenados em a partição p2 e todos os valores que não se enquadram em nenhum desses intervalos são armazenados na partição p3.
Particionamento por LIST
Particionar tabelas MySQL por LIST é semelhante ao particionamento por RANGE - a principal diferença de particionar tabelas por LIST é que quando as tabelas são particionadas por LIST cada partição é definida e selecionada com base na associação de um valor de coluna em um conjunto de listas de valores em vez de um intervalo de valores. O particionamento por LIST pode ser útil quando você sabe que, por exemplo, tem dados que podem ser divididos em vários conjuntos menores de dados (digamos, regiões). Suponha que você tenha uma loja com 4 franquias:uma na parte central da cidade, a segunda no norte, a terceira no leste e a quarta no oeste. Você pode particionar uma tabela de forma que os dados pertencentes a uma determinada franquia sejam armazenados em uma partição dedicada a essa franquia:
PARTITION BY LIST(store) (
PARTITION central VALUES IN (1,3,5),
PARTITION north VALUES IN (2,4,7),
PARTITION east VALUES IN (8,9),
PARTITION west VALUES IN (10,11)
);
Particionamento por HASH
Particionar tabelas MySQL por HASH pode ser uma maneira de garantir que os dados entre as partições sejam distribuídos uniformemente. Se você estiver particionando suas tabelas por HASH, você só precisa especificar em quantas partições você precisa que seus dados sejam divididos - o resto é cuidado pelo MySQL. Você pode usar o particionamento por HASH adicionando a seguinte instrução a CREATE TABLE:
PARTITION BY HASH(id)
PARTITIONS 5;
Substitua 5 pelo número que especifica em quantas partições você precisa que seus dados sejam divididos - o número padrão é 1.
O MySQL também suporta particionamento por LINEAR HASH - o hash linear difere do hash regular porque o hash linear utiliza um algoritmo linear de potências de dois. Para particionar tabelas por um LINEAR HASH, substitua PARTITION BY HASH por PARTITION BY LINEAR HASH.
Particionamento por KEY
Particionar tabelas MySQL por KEY é semelhante a particionar tabelas MySQL por HASH - neste caso, a função de hash para particionamento de chave é fornecida pelo servidor MySQL. Quaisquer colunas usadas como chave de particionamento devem incluir a chave primária da tabela inteira ou pelo menos fazer parte da chave primária da tabela. Se nenhum nome de coluna for especificado como chave de particionamento, a chave primária será usada. Se não houver chave primária, mas houver uma chave exclusiva, a chave exclusiva será usada. Por exemplo, as instruções a seguir são válidas, mesmo que a primeira instrução nem especifique a chave de particionamento:
CREATE TABLE demo_table (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL DEFAULT ''
)
PARTITION BY KEY()
PARTITIONS 2;
CREATE TABLE demo_table (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
)
PARTITION BY KEY(id)
PARTITIONS 5;
Conclusão
Para resumir, as partições podem ser úteis se você tiver muitos dados, se suas tabelas forem muito grandes para caber na memória ou se contiverem dados históricos. As partições também podem ser úteis se você achar que precisará distribuir o conteúdo de uma tabela em diferentes mídias de armazenamento, também se desejar ter a opção de excluir ou restaurar partições individuais.
No entanto, tenha em mente que as partições no MySQL têm suas próprias desvantagens. Uma das principais desvantagens do particionamento é que ele tornará suas tabelas maiores - você não pode ganhar velocidade sem comprometer o espaço. Se você tiver um conjunto muito grande de dados, isso pode ser um grande problema.