O In-Memory Column Index (IMCI) adiciona um column store e uma camada de computação em memória ao PolarDB for MySQL, permitindo o processamento híbrido transacional e analítico (HTAP) em um único cluster. Essa abordagem mantém o desempenho de OLTP e elimina a necessidade de migrar dados.
Por que o MySQL precisa de um column store
O MySQL foi projetado para processamento de transações online (OLTP): consultas a linhas individuais, gravações simultâneas e transações de baixa latência. Como os clusters do PolarDB armazenam rotineiramente centenas de terabytes, os usuários precisam cada vez mais de análises em tempo real sobre os mesmos dados que alimentam suas aplicações. Três abordagens arquitetônicas surgiram para atender a essa demanda.
MySQL + banco de dados AP dedicado
Implante dois sistemas separados — o MySQL para OLTP e um banco de dados OLAP especializado para análises — com um pipeline de sincronização entre eles. Embora essa estratégia ofereça o melhor mecanismo para cada carga de trabalho, o custo é alto: duas pilhas tecnológicas para manter, latência de sincronização que deixa os dados analíticos desatualizados e ausência de um caminho direto para consistência em tempo real.

Design divergente de múltiplas réplicas
Bancos de dados NewSQL distribuídos, como o TiDB (a partir da versão 4.0), atribuem formatos de armazenamento diferentes a réplicas distintas dentro de cada grupo Raft. Uma réplica executa o TiFlash, um column store, para atender a consultas analíticas; as outras réplicas cuidam do OLTP. O roteamento inteligente de consultas seleciona automaticamente a réplica adequada. Esse modelo funciona bem para novas implantações, mas exige a migração do MySQL, o que introduz problemas de compatibilidade.

Armazenamento híbrido linha-coluna integrado
A abordagem mais avançada armazena dados orientados a linhas e a colunas na mesma instância de banco de dados. Todos os principais bancos de dados comerciais utilizam esse design:
A Oracle introduziu o conjunto Database In-Memory no Oracle Database 12c (2013), utilizando um column store em memória com execução híbrida linha-coluna e otimizações de consulta baseadas em expressões materializadas e JoinGroup.
O SQL Server adicionou índices columnstore no SQL Server 2016 SP1, com suporte a tabelas orientadas a linhas, tabelas orientadas a colunas e combinações híbridas.
O IBM Db2 lançou o BLU Acceleration no Kepler 10.5 (2013), combinando column store, computação em memória e data skipping.

Os três convergiram para esse design pelo mesmo motivo: um column store oferece melhor eficiência de E/S (compressão, data skipping, column pruning) e melhor eficiência de CPU (padrões de acesso favoráveis ao cache). No entanto, os índices de column store são esparsos — eles não conseguem localizar linhas individuais com a mesma eficiência de um índice B+ tree. Um mecanismo híbrido linha-coluna resolve essa questão: o row store lida com o OLTP por meio de indexação precisa no nível da linha, enquanto o column store acelera varreduras analíticas em massa. A baixa latência da DRAM compensa a diferença de desempenho nas atualizações do column store.
Por que o PolarDB precisava de um novo mecanismo de execução
A pilha de capacidades do PolarDB espelha o MySQL open source. Embora o PolarDB lide eficientemente com o OLTP e suporte até 500 TB de dados por cluster, consultas analíticas complexas ainda são lentas. Os gargalos são intrínsecos à arquitetura do MySQL:
Modelo de execução serial. O modelo de iterador volcano do MySQL processa uma linha por vez. Cada recuperação de linha aciona várias camadas de chamadas de função, incluindo despacho de funções virtuais. Isso destrói a eficiência do pipeline da CPU e impede o uso de instruções SIMD.
Ausência de consulta paralela. O executor do MySQL é single-thread. O suporte a consultas paralelas no MySQL 8.0 abrange apenas operações básicas, como
COUNT(*); SQL analítico complexo é executado em série, independentemente de quantos núcleos de CPU estejam disponíveis.Desperdício de E/S no row store. Quando uma consulta analítica precisa de apenas 3 colunas de uma tabela com 50 colunas, o MySQL ainda lê todas as 50 colunas do disco. O formato de row store torna o acesso seletivo a colunas inerentemente ineficiente.
O framework de consulta paralela do PolarDB resolve o gargalo da CPU distribuindo o trabalho de varredura entre vários threads e agregando os resultados no thread principal:

A consulta paralela rompe o teto de núcleo único e reduz o tempo de consulta para cargas de trabalho intensivas em varredura. Porém, a ineficiência de E/S do row store impõe um limite que a execução paralela sozinha não consegue superar. Eliminar esse teto exige um column store.
Um column store melhora o desempenho em dois níveis:
Eficiência de E/S. As consultas leem apenas as colunas necessárias. Os dados em coluna atingem taxa de compressão superior a 10 vezes em comparação ao row store. Combinado com rough indexes (estatísticas MIN/MAX por bloco de dados), grandes blocos de dados irrelevantes podem ser ignorados antes da descompressão. Na arquitetura de computação e armazenamento separados do PolarDB, menos dados transferidos pela rede resultam diretamente em respostas de consulta mais rápidas.
Eficiência de CPU. Os dados em coluna são armazenados contiguamente, o que melhora as taxas de acerto do cache da CPU e reduz as paralisações por falha nos caches L1/L2. Dados em coluna contíguos também permitem a vetorização SIMD, multiplicando o throughput de núcleo único.
Termos-chave
|
Termo |
Definição |
|
IMCI |
In-Memory Column Index. Implementação do PolarDB de um armazenamento híbrido linha-coluna. |
|
Índice colunar |
Índice secundário no InnoDB que armazena dados em formato colunar em vez de formato de linha. |
|
Grupo de linhas |
Unidade de organização de dados em um índice colunar. Cada grupo de linhas contém 64.000 linhas. |
|
Pacote de dados |
Dados de uma única coluna dentro de um grupo de linhas, armazenados contiguamente e compactados. |
|
Rough index |
Estatísticas pré-computadas (MIN, MAX, SUM, contagem de nulos, contagem de linhas) para cada pacote de dados, usadas para ignorar pacotes irrelevantes sem descompactá-los. |
|
Área de Column Store em Memória |
Região de memória onde pacotes de dados ativos ficam em cache para execução de consultas. Os dados em coluna são compactados no disco e mantidos em cache nesta área. |
|
Grau de paralelismo (DOP) |
Número de threads paralelos usados para executar uma consulta. O Auto DOP define esse valor automaticamente com base nos recursos do sistema. |
|
Modelo Volcano |
Modelo de execução de consulta onde cada operador expõe uma interface |
|
Execução vetorizada |
Variante do modelo volcano onde cada chamada |
Como o IMCI funciona
O IMCI combina quatro inovações técnicas:
Índices colunares no InnoDB. Crie índices colunares em colunas selecionadas usando instruções DDL. Índices colunares usam armazenamento compactado por coluna — significativamente menor que o row store — e residem na Área de Column Store em Memória por padrão. Quando a memória é insuficiente, eles transbordam para o armazenamento compartilhado.
Mecanismo de execução orientado a colunas. O executor do PolarDB acessa dados em lotes de 4.096 linhas e aplica instruções SIMD para processar vários valores em uma única operação de CPU. Todos os operadores principais (Scan, Hash Join, Nested Loop Join, Group By) suportam execução paralela. Em comparação ao executor de linhas do MySQL, o executor de colunas oferece desempenho ordens de magnitude superior em cargas de trabalho analíticas.
Otimizador híbrido linha-coluna. Ao enviar uma consulta, o otimizador avalia o custo de três caminhos de execução — execução serial no row store, consulta paralela no row store e IMCI — e seleciona o plano de menor custo. Um mecanismo de lista de permissões garante que consultas usando tipos de coluna ou operadores não suportados retornem automaticamente ao row store, preservando 100% de compatibilidade com o MySQL.
Isolamento de cargas AP/TP. Configure um nó somente leitura (RO) dedicado como um nó analítico com índices colunares. Consultas analíticas são executadas no nó RO utilizando toda a CPU e memória disponíveis, sem impacto nas cargas de trabalho OLTP executadas em nós de leitura/gravação (RW).

Arquitetura técnica
Otimizador híbrido linha-coluna
Mecanismo de execução orientado a colunas
O mecanismo de execução do IMCI é uma reescrita completa, independente do executor de linhas do MySQL. Seu objetivo é eliminar dois gargalos fundamentais: sobrecarga de funções virtuais por linha e incapacidade de paralelizar a execução.
Executor paralelo vetorizado
Sistema de expressões vetorizado
Armazenamento híbrido linha-coluna
Desempenho OLAP
Para resultados de benchmarks, consulte Desempenho do IMCI.











