O Elastic Parallel Query (ePQ) acelera consultas a dados frios armazenados em tabelas OSS ao distribuir o trabalho entre várias threads de execução, seja em um único nó ou simultaneamente em vários nós.
Como funciona
O ePQ atribui tarefas de varredura independentes a workers paralelos. Cada worker lê uma parte dos dados CSV na tabela OSS de forma concorrente e agrega os resultados. O grau de paralelismo depende do número de workers e da quantidade de nós envolvidos.

A consulta paralela em dados frios oferece suporte apenas ao formato CSV.
Versões compatíveis
Todos os modos exigem a Enterprise Edition.
|
Modo |
Mecanismo de banco de dados |
Versão de revisão mínima |
|
Consulta paralela em nó único (MySQL 8.0.1) |
MySQL 8.0.1 |
8.0.1.1.34 |
|
Consulta paralela em nó único (MySQL 8.0.2) |
MySQL 8.0.2 |
8.0.2.2.24 |
|
Consulta paralela em múltiplos nós |
MySQL 8.0.2 |
8.0.2.2.24 |
Pré-requisitos
Antes de começar, verifique se você:
Conectou-se ao cluster. Consulte Conectar-se a um cluster
Ativou o arquivamento de dados frios no cluster. Consulte Ativar arquivamento de dados frios
Ative o recurso ePQ. Consulte Ativar elastic parallel query
Possui dados frios no formato CSV
Defina
loose_csv_max_oss_threadscomo 2 ou superior

O parâmetro loose_csv_max_oss_threads controla o número máximo de threads OSS executadas em paralelo em um único nó. Valores válidos: 1–100. Padrão: 1. Com o valor padrão 1, a consulta paralela permanece desativada. Como cada thread OSS consome 128 MB de memória, defina esse parâmetro conforme a memória disponível no cluster.
Execute consultas paralelas em dados frios
Os exemplos abaixo utilizam um conjunto de dados TPC-H, mas não atendem a todos os requisitos de um teste de benchmark formal do TPC-H. Portanto, os resultados não são comparáveis aos benchmarks TPC-H publicados. Para mais detalhes, consulte Conjunto de dados TPC-H .
Os exemplos usam uma tabela chamada lineitem, arquivada no OSS em formato CSV:
mysql> show create table lineitem;
*************************** 1. row ***************************
Table: lineitem
Create Table: 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(10,2) NOT NULL,
`l_extendedprice` decimal(10,2) NOT NULL,
`l_discount` decimal(10,2) NOT NULL,
`l_tax` decimal(10,2) NOT NULL,
`l_returnflag` char(1) NOT NULL,
`l_linestatus` char(1) NOT NULL,
`l_shipDATE` date NOT NULL,
`l_commitDATE` date NOT NULL,
`l_receiptDATE` date NOT NULL,
`l_shipinstruct` char(25) NOT NULL,
`l_shipmode` char(10) NOT NULL,
`l_comment` varchar(44) NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 /*!99990 800020204 NULL_MARKER='NULL' */ CONNECTION='default_oss_server'
1 row in set (0.00 sec)
Para ativar a consulta paralela, adicione a dica /*+ PARALLEL(N) */ à sua consulta, onde N representa o número de workers por nó. Para verificar se a consulta paralela está ativa, execute EXPLAIN e analise a coluna Extra:
|
**Valor da coluna |
Significado |
|
|
Consulta paralela ativa; N indica o total de threads de execução em todos os nós participantes |
|
|
Consulta paralela em múltiplos nós ativa; N corresponde ao número de nós participantes |
Paralelismo total = workers por nó × número de nós.
Consulta serial
Sem a dica, a consulta é executada em uma única thread. A coluna Extra exibe Using where sem Parallel scan:
mysql> explain SELECT
-> sum(l_extendedprice * l_discount) AS revenue
-> FROM
-> lineitem
-> WHERE
-> l_shipdate >= date '1994-01-01'
-> AND l_shipdate < date '1994-01-01' + interval '1' year
-> AND l_discount between 0.05 - 0.01 AND 0.05 + 0.01
-> AND l_quantity < 24;
+----+-------------+----------+------------+------+---------------+------+---------+------+----------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+----------+------------+------+---------------+------+---------+------+----------+----------+-------------+
| 1 | SIMPLE | lineitem | NULL | ALL | NULL | NULL | NULL | NULL | 61560489 | 0.41 | Using where |
+----+-------------+----------+------------+------+---------------+------+---------+------+----------+----------+-------------+
1 row in set, 1 warning (1.23 sec)
A varredura e a agregação da tabela ocorrem sequencialmente em uma única thread.
Consulta paralela em nó único
Adicione /*+ PARALLEL(4) */ para distribuir a varredura entre 4 workers no nó atual. A mensagem Parallel scan (4 workers) na coluna Extra confirma a ativação da consulta paralela:
mysql> explain SELECT /*+ PARALLEL(4) */
-> sum(l_extendedprice * l_discount) AS revenue
-> FROM
-> lineitem
-> WHERE
-> l_shipdate >= date '1994-01-01'
-> AND l_shipdate < date '1994-01-01' + interval '1' year
-> AND l_discount between 0.05 - 0.01 AND 0.05 + 0.01
-> AND l_quantity < 24;
+----+-------------+-------------+------------+------+---------------+------+---------+------+----------+----------+----------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------------+------------+------+---------------+------+---------+------+----------+----------+----------------------------------------+
| 1 | SIMPLE | <gather1.1> | NULL | ALL | NULL | NULL | NULL | NULL | 4 | 100.00 | NULL |
| 1 | SIMPLE | lineitem | NULL | ALL | NULL | NULL | NULL | NULL | 15390122 | 0.41 | Parallel scan (4 workers); Using where |
+----+-------------+-------------+------------+------+---------------+------+---------+------+----------+----------+----------------------------------------+
2 rows in set, 1 warning (2.17 sec)
Quatro workers executam em paralelo no nó atual, proporcionando aproximadamente 4 vezes o throughput de uma consulta single-thread.
Consulta paralela em múltiplos nós
Quando vários nós participam, a coluna Extra exibe tanto Parallel scan (N workers) quanto MPP (N nodes). Neste cenário, Parallel scan (8 workers) indica 8 workers ativos no total entre todos os nós, enquanto MPP (2 nodes) sinaliza a participação de 2 nós, com 4 workers cada:
mysql> explain SELECT /*+ PARALLEL(4) */
-> sum(l_extendedprice * l_discount) AS revenue
-> FROM
-> lineitem
-> WHERE
-> l_shipdate >= date '1994-01-01'
-> AND l_shipdate < date '1994-01-01' + interval '1' year
-> AND l_discount between 0.05 - 0.01 AND 0.05 + 0.01
-> AND l_quantity < 24;
+----+-------------+-------------+------------+------+---------------+------+---------+------+----------+----------+-------------------------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------------+------------+------+---------------+------+---------+------+----------+----------+-------------------------------------------------------+
| 1 | SIMPLE | <gather1.1> | NULL | ALL | NULL | NULL | NULL | NULL | 1 | 100.00 | NULL |
| 1 | SIMPLE | lineitem | NULL | ALL | NULL | NULL | NULL | NULL | 59986051 | 0.41 | Parallel scan (8 workers); MPP (2 nodes); Using where |
+----+-------------+-------------+------------+------+---------------+------+---------+------+----------+----------+-------------------------------------------------------+
2 rows in set, 1 warning (0.00 sec)
Com 2 nós e 8 workers no total, o throughput da consulta atinge aproximadamente 8 vezes o valor de uma consulta single-thread.
Solução de problemas
Caso o EXPLAIN não mostre Parallel scan na coluna Extra, a consulta paralela não foi ativada. Verifique os itens a seguir:
|
Condição |
Correção |
|
|
Defina como 2 ou superior |
|
Dados frios fora do formato CSV |
Converta os dados para CSV antes de arquivar |
|
Versão do cluster inferior ao requisito mínimo |
Atualize para uma versão de revisão compatível (consulte Versões compatíveis) |
|
ePQ desativado |
Ative o ePQ (consulte Ativar elastic parallel query) |