O design do esquema determina como o AnalyticDB for MySQL armazena e recupera dados. Um esquema bem projetado mantém as linhas consultadas em conjunto no mesmo nó, equilibra a carga de trabalho de cada nó e evita hotspots de dados. Este documento aborda tipos de tabela, chaves de distribuição, chaves de partição, chaves primárias e chaves de índice clusterizado.
Tipos de tabela
O AnalyticDB for MySQL oferece dois tipos de tabela. Escolha o tipo adequado com base no volume de dados:
|
Tipo de tabela |
Armazenamento dos dados |
Volume de dados recomendado |
|
Tabela replicada |
Cópia completa em cada nó do cluster |
Até 20.000 linhas |
|
Tabela padrão (tabela particionada) |
Fragmentação entre nós pela chave de distribuição |
De dezenas de milhões a centenas de bilhões de linhas |
Use tabelas replicadas para pequenas tabelas de dimensão frequentemente associadas a grandes tabelas de fatos. Para todos os outros casos, use tabelas padrão.
Chave de distribuição
Objetivo de design: minimizar a movimentação de dados durante a execução da consulta ao manter as linhas consultadas em conjunto no mesmo nó.
Ao criar uma tabela padrão, especifique uma chave de distribuição usando a cláusula DISTRIBUTED BY HASH. O AnalyticDB for MySQL fragmenta a tabela aplicando hash ao valor da chave de distribuição e roteando cada linha para o nó correspondente.
DISTRIBUTED BY HASH(column_name, ...)
Como escolher uma chave de distribuição
Selecione uma chave de distribuição com base nos critérios abaixo, em ordem de prioridade:
Distribuição uniforme de valores — escolha uma coluna de alta cardinalidade para que as linhas se espalhem uniformemente pelos nós. Boas opções incluem IDs de transação, IDs de dispositivo, IDs de usuário e colunas de incremento automático. Uma distribuição desigual causa distorção de dados e degrada o desempenho de gravação.
Colunas de junção — se uma consulta associa duas tabelas em uma coluna específica, use essa coluna como chave de distribuição para ambas. Isso direciona as linhas correspondentes para o mesmo nó e elimina a reorganização de dados entre nós. Por exemplo, para consultar pedidos históricos por cliente, use
customer_idcomo chave de distribuição.Colunas de filtro frequentes — colunas recorrentes em cláusulas
WHEREpermitem que o AnalyticDB for MySQL leia apenas os shards relevantes e ignore os demais.Menor número possível de campos — cada tabela possui exatamente uma chave de distribuição, mas ela pode abranger várias colunas. Menos colunas na chave de distribuição aumentam sua utilidade para uma variedade maior de consultas.
Não utilize colunas DATE, TIME ou TIMESTAMP como chave de distribuição. Valores do tipo data concentram os dados em poucos buckets de hash, causando distorção severa e degradando o desempenho de gravação. Além disso, a maioria das consultas filtra por intervalo de tempo, o que concentra todas as linhas correspondentes em um único nó e anula os benefícios da arquitetura distribuída. Em vez disso, use campos dos tipos DATE ou TIME como chaves de partição.
Comportamento padrão quando nenhuma chave de distribuição é especificada:
Se a tabela tiver uma chave primária, o AnalyticDB for MySQL a utilizará como chave de distribuição.
Caso a tabela não tenha chave primária, o sistema adiciona uma coluna
__adb_auto_id__e a utiliza tanto como chave primária quanto como chave de distribuição.
Chave de partição
Objetivo de design: particionar ainda mais cada shard para melhorar o desempenho de acesso aos dados. Se um único shard contiver uma grande quantidade de dados após a definição da chave de distribuição, subdivida-o usando uma chave de partição. Também é possível usar a configuração LIFECYCLE para gerenciar o ciclo de vida dos dados e permitir a exclusão eficiente de dados antigos em escala.
Especifique uma chave de partição usando a cláusula PARTITION BY VALUE:
-- Partition by the raw column value
PARTITION BY VALUE(column_name)
-- Partition by day (e.g., 20210101)
PARTITION BY VALUE(DATE_FORMAT(column_name, '%Y%m%d'))
PARTITION BY VALUE(FROM_UNIXTIME(column_name, '%Y%m%d'))
-- Partition by month (e.g., 202101)
PARTITION BY VALUE(DATE_FORMAT(column_name, '%Y%m'))
PARTITION BY VALUE(FROM_UNIXTIME(column_name, '%Y%m'))
-- Partition by year (e.g., 2021)
PARTITION BY VALUE(DATE_FORMAT(column_name, '%Y'))
PARTITION BY VALUE(FROM_UNIXTIME(column_name, '%Y'))
Use a palavra-chave LIFECYCLE N para definir uma janela de retenção. O AnalyticDB for MySQL mantém as N partições mais recentes e descarta automaticamente as mais antigas.
Como escolher uma chave de partição
Granularidades suportadas: ano, mês, dia ou valor bruto. Não há granularidade mais fina.
Adequação da granularidade ao volume de dados: uma granularidade muito grossa (por exemplo, particionar por ano em uma tabela que cresce milhões de linhas por dia) cria partições excessivamente grandes e degrada o desempenho de consulta e gravação. Por outro lado, uma granularidade muito fina gera um número excessivo de partições pequenas, resultando no mesmo problema.
Trate as partições como unidades estáveis: evite designs em que muitas partições históricas sofram atualizações frequentes. Atualizações constantes em várias partições indicam uma escolha inadequada da coluna de partição.
Defina um ciclo de vida: como o número máximo de partições por tabela é limitado, os dados em uma tabela particionada não podem ser retidos indefinidamente. Sempre defina um valor de
LIFECYCLEpara evitar atingir esse limite. Para limites de partição, consulte Limites.
O número máximo de partições por tabela é limitado. Os dados em uma tabela particionada não podem ser retidos permanentemente. Para detalhes, consulte Limites.
Para diagnosticar se a coluna de partição escolhida é adequada, use os Diagnósticos de adequação do campo de distribuição.
Chave primária
Uma chave primária identifica exclusivamente cada linha. Apenas tabelas com chave primária suportam operações DELETE e UPDATE.
PRIMARY KEY (column_name, ...)
Como escolher uma chave primária
Inclusão obrigatória da chave de distribuição e da chave de partição: a chave primária deve conter todas as colunas da chave de distribuição e da chave de partição. Coloque essas colunas primeiro na definição da chave primária composta.
Preferência por colunas numéricas: campos de chave primária numéricos melhoram o desempenho de busca em comparação com campos de string.
Uso do menor número possível de colunas: uma chave primária mais estreita reduz a sobrecarga de índice.
Para detalhes sobre a sintaxe de PRIMARY KEY, consulte CREATE TABLE.
Chave de índice clusterizado
Um índice clusterizado ordena fisicamente as linhas da tabela pelo valor da chave de índice. Consultas que filtram consistentemente pela chave de índice clusterizado beneficiam-se de forte localidade de dados, pois as linhas correspondentes ficam armazenadas juntas no disco.
Quando usar um índice clusterizado
Índices clusterizados não se destinam a todas as tabelas. Cada tabela suporta apenas um índice clusterizado, e sua manutenção consome recursos de CPU. Use um índice clusterizado somente quando:
As consultas filtrarem consistentemente por uma coluna específica ou conjunto de colunas, and
A melhoria no tempo de resposta da consulta justificar o custo adicional de CPU para manter o índice.
Exemplo: em um sistema de informações estudantis onde cada aluno consulta apenas suas próprias notas, defina o ID do aluno como chave de índice clusterizado. Todas as linhas de um determinado aluno ficam armazenadas contiguamente, permitindo que a consulta leia um único bloco sequencial em vez de varrer toda a tabela.
Para a sintaxe de criação de um índice clusterizado, consulte CREATE TABLE.
Exemplo
Crie uma tabela customer com o seguinte esquema:
Chave de distribuição:
customer_id— distribui as linhas uniformemente e suporta consultas de junção baseadas em clientesChave de partição:
login_timeparticionada por dia (%Y%m%d) — permite a expiração eficiente de dados antigosCiclo de vida: 30 — retém dados das 30 partições mais recentes
Chave primária:
(login_time, customer_id, phone_num)— começa com a chave de partição e a chave de distribuição
CREATE TABLE customer (
customer_id bigint NOT NULL COMMENT 'Customer ID',
customer_name varchar NOT NULL COMMENT 'Customer name',
phone_num bigint NOT NULL COMMENT 'Phone number',
city_name varchar NOT NULL COMMENT 'City',
sex int NOT NULL COMMENT 'Gender',
id_number varchar NOT NULL COMMENT 'ID card number',
home_address varchar NOT NULL COMMENT 'Home address',
office_address varchar NOT NULL COMMENT 'Office address',
age int NOT NULL COMMENT 'Age',
login_time timestamp NOT NULL COMMENT 'Logon time',
PRIMARY KEY (login_time, customer_id, phone_num)
)
DISTRIBUTED BY HASH(customer_id)
PARTITION BY VALUE(DATE_FORMAT(login_time, '%Y%m%d')) LIFECYCLE 30
COMMENT 'Customer information table';
A chave primária começa com login_time (chave de partição) e customer_id (chave de distribuição), seguidos por phone_num para garantir unicidade no nível de linha.
FAQ
Como visualizo todas as partições de uma tabela e suas estatísticas?
Execute a seguinte consulta em information_schema.kepler_partitions:
SELECT
partition_id, -- Partition name
row_count, -- Total rows in the partition
local_data_size, -- Local storage used by the partition
index_size, -- Index size
pk_size, -- Primary key index size
remote_data_size -- Remote storage used by the partition
FROM information_schema.kepler_partitions
WHERE schema_name = '$DB'
AND table_name = '$TABLE'
AND partition_id > 0;
Partições em dados incrementais sem compactação acionada não aparecem nesta consulta. Para obter uma lista em tempo real de todas as partições, execute SELECT DISTINCT $partition_column FROM $db.$table;.
O que determina o número de shards? Posso alterá-lo?
O cálculo do número de shards ocorre automaticamente com base nas especificações do cluster no momento da criação. Não é possível alterá-lo manualmente.
O dimensionamento vertical do cluster altera o número de shards?
Não. Upgrades e downgrades do cluster não afetam o número de shards.
Posso alterar a chave de distribuição ou a chave de partição após criar uma tabela?
Não. Para alterar a chave de distribuição ou a chave de partição, consulte ALTER TABLE.
Próximos passos
CREATE TABLE — referência completa de sintaxe para criação de tabelas
ALTER TABLE — opções para modificar uma tabela existente
Diagnósticos de adequação do campo de distribuição — diagnostique escolhas de campos de distribuição e partição
Limites — limites de partição e tabela