O recurso de filtro de arquivos do OSS ignora blocos de dados irrelevantes no OSS durante a execução de consultas, o que reduz o volume de dados verificados e acelera as consultas a dados frios.
Como funciona
Para cada bloco de dados arquivado, o PolarDB coleta estatísticas, gera dados de filtro e os armazena no OSS. Durante a execução de uma consulta, o mecanismo envia as condições para a camada de dados frios em formato CSV, compara-as com os dados de filtro e ignora os blocos que não podem conter linhas correspondentes.
Cada tipo de dado admite diferentes estratégias de filtro:
|
Estratégia de filtro |
Tipos de dados aplicáveis |
Mais indicado para |
|
Estatísticas de mínimo/máximo |
Numérico, hora |
Dados ordenados ou parcialmente ordenados (por exemplo, timestamps, IDs sequenciais) |
|
Mapa de caracteres |
String ( |
Filtragem de prefixo de string sensível a maiúsculas e minúsculas |
|
Filtro Bloom |
Todos os tipos de dados |
Dados globalmente não ordenados; strings UUID |
Em dados de séries temporais — típicos em cenários de arquivamento —, filtrar colunas do tipo tempo pode gerar ganhos significativos de desempenho nas consultas.
Pré-requisitos
Antes de começar, certifique-se de que:
O cluster executa o MySQL 8.0.2, versão de revisão 8.0.2.2.25 ou posterior
O cluster tem o arquivamento de dados frios ativado
Uma conexão com o cluster está estabelecida. Consulte Conectar-se a um cluster
A tabela utiliza dados frios do OSS no formato CSV e possui
OSS META=1ativado
Para verificar se OSS META=1 está definido, execute SHOW CREATE TABLE e confirme se a saída contém OSS META=1:
SHOW CREATE TABLE t;
Exemplo de saída:
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE `t` (
`id` int(11) DEFAULT NULL
) /*!99990 800020213 STORAGE OSS */ ENGINE=CSV DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800020204 NULL_MARKER='NULL' */ /*!99990 800020223 OSS META=1 */
1 row in set (0.00 sec)
Para mais informações, consulte Executar operações DDL em dados frios.
Limitações
Compatibilidade:
Não é possível ativar o recurso de filtro de arquivos do OSS se o Elastic Parallel Query (ePQ) já estiver ativado.
A tabela deve conter dados. Tabelas OSS vazias não suportam este recurso para aceleração de consultas.
Tipos de dados suportados:
|
Categoria |
Tipos de dados |
|
Inteiro |
|
|
Ponto flutuante |
|
|
Ponto fixo |
|
|
Tempo |
|
|
String |
|
O filtro Bloom suporta todos os tipos de dados.
Operadores suportados:
Os seguintes operadores acionam o pushdown de filtro: =, <=>, <, <=, >=, >, BETWEEN, LIKE, IS NULL, IS NOT NULL.
No operador LIKE, o caractere curinga de porcentagem (%) deve aparecer apenas no lado direito: LIKE 'ABC%'. Padrões como LIKE '%ABC' ou LIKE '%ABC%' não acionam o pushdown de filtro.
Colunas do tipo string aceitam apenas comparações sensíveis a maiúsculas e minúsculas.
Há suporte para múltiplas condições conectadas por AND. O filtro não avalia condições conectadas por OR.
Padrões que não acionam o pushdown de filtro:
|
Padrão |
Motivo |
|
|
O caractere curinga deve estar apenas no lado direito |
|
|
O filtro não avalia condições com |
|
Consultas em tabelas OSS vazias |
O filtro requer pelo menos uma linha de dados |
Ativar o filtro de arquivos do OSS
No console, defina o parâmetro do cluster
loose_use_oss_metacomoONpara ativar o recursoUSE_OSS_META. Para mais informações, consulte Configurar parâmetros de cluster e nó.Defina o parâmetro do cluster
loose_optimizer_switchcomoENGINE_CONDITION_PUSHDOWN=ONno console. Para mais informações, consulte Configurar parâmetros de cluster e nó.Altere o parâmetro do cluster
loose_csv_oss_file_filterparaONno console. Para mais informações, consulte Configurar parâmetros de cluster e nó.-
Conecte-se ao cluster e verifique se os três parâmetros estão ativos:
-- Verify that oss_file_filter is ON SHOW VARIABLES LIKE 'oss_file_filter'; -- Verify that use_oss_meta is ON SHOW VARIABLES LIKE 'use_oss_meta'; -- Verify that ENGINE_CONDITION_PUSHDOWN is ON SHOW VARIABLES LIKE 'optimizer_switch';
Criar um filtro de arquivos do OSS
Use a opção OSS_FILE_FILTER ao arquivar uma tabela ou em uma instrução ALTER TABLE em uma tabela já arquivada.
Sintaxe da opção:
OSS_FILE_FILTER = 'field_filter[,field_filter]'
field_filter := field_name[:filter_type]
filter_type := bloom
Por padrão, colunas numéricas e de tempo usam estatísticas de mínimo/máximo, enquanto colunas de string usam o mapa de caracteres. Para aplicar um filtro Bloom em uma coluna, adicione :bloom ao nome da coluna.
Para valores UUID armazenados em colunas de string, utilize um filtro Bloom ( :bloom ) para obter maior eficiência na filtragem.
Criar um filtro ao arquivar uma tabela
Especifique OSS_FILE_FILTER como parte da instrução ALTER TABLE ... ENGINE = CSV STORAGE OSS:
-- Archive the table and create an OSS file filter on L_ORDERKEY, L_LINENUMBER, and L_SHIPDATE
ALTER TABLE lineitem ENGINE = CSV STORAGE OSS
OSS_FILE_FILTER = 'L_ORDERKEY,L_LINENUMBER,L_SHIPDATE';
Definição completa da tabela utilizada neste exemplo:
CREATE TABLE `lineitem` (
`L_ORDERKEY` int(11) NOT NULL,
`L_PARTKEY` int(11) NOT NULL,
`L_SUPPKEY` int(11) NOT NULL,
`L_LINENUMBER` int(11) NOT NULL,
`L_QUANTITY` decimal(15,2) NOT NULL,
`L_EXTENDEDPRICE` decimal(15,2) NOT NULL,
`L_DISCOUNT` decimal(15,2) NOT NULL,
`L_TAX` decimal(15,2) NOT NULL,
`L_RETURNFLAG` char(1) COLLATE utf8_bin NOT NULL,
`L_LINESTATUS` char(1) COLLATE utf8_bin NOT NULL,
`L_SHIPDATE` date NOT NULL,
`L_COMMITDATE` date NOT NULL,
`L_RECEIPTDATE` date NOT NULL,
`L_SHIPINSTRUCT` char(25) COLLATE utf8_bin NOT NULL,
`L_SHIPMODE` char(10) COLLATE utf8_bin NOT NULL,
`L_COMMENT` varchar(44) COLLATE utf8_bin NOT NULL
) ENGINE = innodb;
Adicionar um filtro a uma tabela já arquivada
Execute ALTER TABLE com OSS_FILE_FILTER em uma tabela que já esteja no formato CSV STORAGE OSS:
-- Add an OSS file filter to an archived table
-- L_SHIPINSTRUCT uses a Bloom filter; the other columns use the default strategy
ALTER TABLE lineitem OSS_FILE_FILTER = 'L_ORDERKEY,L_LINENUMBER,L_SHIPDATE,L_SHIPINSTRUCT:BLOOM';
A definição de tabela para uma tabela já arquivada usa ENGINE = CSV STORAGE OSS:
CREATE TABLE `lineitem` (
`L_ORDERKEY` int(11) NOT NULL,
`L_PARTKEY` int(11) NOT NULL,
`L_SUPPKEY` int(11) NOT NULL,
`L_LINENUMBER` int(11) NOT NULL,
`L_QUANTITY` decimal(15,2) NOT NULL,
`L_EXTENDEDPRICE` decimal(15,2) NOT NULL,
`L_DISCOUNT` decimal(15,2) NOT NULL,
`L_TAX` decimal(15,2) NOT NULL,
`L_RETURNFLAG` char(1) COLLATE utf8_bin NOT NULL,
`L_LINESTATUS` char(1) COLLATE utf8_bin NOT NULL,
`L_SHIPDATE` date NOT NULL,
`L_COMMITDATE` date NOT NULL,
`L_RECEIPTDATE` date NOT NULL,
`L_SHIPINSTRUCT` char(25) COLLATE utf8_bin NOT NULL,
`L_SHIPMODE` char(10) COLLATE utf8_bin NOT NULL,
`L_COMMENT` varchar(44) COLLATE utf8_bin NOT NULL
) ENGINE = CSV STORAGE OSS;
Verificar o pushdown de filtro
Após criar um filtro de arquivos do OSS, execute EXPLAIN para confirmar se as condições do filtro estão sendo enviadas para a camada de dados do OSS.
EXPLAIN SELECT * FROM lineitem WHERE l_orderkey = 96;
A saída deve incluir With pushed engine condition na coluna Extra:
+----+-------------+----------+------------+------+---------------+------+---------+------+---------+----------+---------------------------------------------------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+----------+------------+------+---------------+------+---------+------+---------+----------+---------------------------------------------------------------------------------+
| 1 | SIMPLE | lineitem | NULL | ALL | NULL | NULL | NULL | NULL | 6001215 | 10.00 | Using where; With pushed engine condition (`test`.`lineitem`.`L_ORDERKEY` = 96) |
+----+-------------+----------+------------+------+---------------+------+---------+------+---------+----------+---------------------------------------------------------------------------------+
Para obter um plano em formato de árvore que mostre explicitamente quais condições de filtro são aplicadas à varredura de dados do OSS:
EXPLAIN FORMAT = TREE SELECT * FROM lineitem WHERE l_orderkey = 96\G
Saída esperada:
*************************** 1. row ***************************
EXPLAIN: -> Filter: (lineitem.L_ORDERKEY = 96) (cost=15010.00 rows=10000)
-> Table scan on lineitem, extra (oss_file_filter conditions: (lineitem.L_ORDERKEY = 96)) (cost=15010.00 rows=100000)
A entrada oss_file_filter conditions confirma que a condição é avaliada no nível do bloco de dados, ignorando blocos sem correspondência antes que sejam carregados na memória.
Após confirmar o filtro, execute a consulta real:
SELECT COUNT(*) FROM lineitem WHERE l_orderkey = 96;