PolarDB permite consultar diretamente dados formatados em CSV no OSS por meio de tabelas externas, o que reduz seus custos de armazenamento. Este tópico descreve como acessar dados no OSS usando tabelas externas.
Pré-requisitos
Seu cluster PolarDB deve atender a um dos seguintes requisitos:
A versão do mecanismo é MySQL 8.0.1 com revisão 8.0.1.1.25.4 ou posterior.
A versão do mecanismo é MySQL 8.0.2 com revisão 8.0.2.2.1 ou posterior.
Para verificar a versão do mecanismo, consulte Consultar a versão do mecanismo.
Como funciona
Uma tabela externa do OSS permite armazenar dados formatados em CSV e pouco consultados (conhecidos como dados frios) no OSS, além de possibilitar sua consulta e análise.
Limitações
Tabelas externas do OSS consultam dados apenas de arquivos CSV.
-
Essas tabelas suportam somente as instruções CREATE, SELECT e DROP.
NotaA operação DROP remove apenas os metadados da tabela no PolarDB, mas não exclui os arquivos de dados no OSS.
Não há suporte para índices, particionamento ou transações em tabelas externas do OSS.
-
Os tipos de dados compatíveis para informações em formato CSV incluem tipos numéricos, tipos de data e hora, tipos de string e valores NULL.
NotaTipos de dados geoespaciais não são suportados.
Arquivos CSV compactados não podem ser consultados.
-
Valores NULL são aceitos apenas se uma das condições abaixo for atendida:
A versão do kernel é MySQL 8.0.1 e a revisão é 8.0.1.1.28 ou posterior.
A versão do kernel é MySQL 8.0.2 e a revisão é 8.0.2.2.5 ou posterior.
Tipos numéricos
Tipo
Tamanho
Intervalo com sinal
Intervalo sem sinal
Descrição
TINYINT
1 byte
-128 a 127
0 a 255
Um inteiro muito pequeno.
SMALLINT
2 bytes
-32768 a 32767
0 a 65535
Um inteiro pequeno.
MEDIUMINT
3 bytes
-8388608 a 8388607
0 a 16777215
Um inteiro de tamanho médio.
INT ou INTEGER
4 bytes
-2147483648 a 2147483647
0 a 4294967295
Um inteiro padrão.
BIGINT
8 bytes
-9.223.372.036.854.775.808 a 9.223.372.036.854.775.807
0 a 18.446.744.073.709.551.615
Um inteiro grande.
FLOAT
4 bytes
-3,402823466E+38 a -1,175494351E-38; 0; 1,175494351E-38 a 3,402823466E+38
0; 1,175494351E-38 a 3,402823466E+38
Um número de ponto flutuante de precisão simples.
DOUBLE
8 bytes
-1,7976931348623157E+308 a -2,2250738585072014E-308; 0; 2,2250738585072014E-308 a 1,7976931348623157E+308
0; 2,2250738585072014E-308 a 1,7976931348623157E+308
Um número de ponto flutuante de precisão dupla.
DECIMAL
Para DECIMAL(M,D), o tamanho é M+2 bytes se M > D, ou D+2 bytes caso contrário.
Depende dos valores de M e D.
Depende dos valores de M e D.
Um número decimal.
Tipos de data e hora
Tipo
Tamanho
Intervalo
Formato
Descrição
DATE
3 bytes
1000-01-01 a 9999-12-31
AAAA-MM-DD
Um valor de data.
TIME
3 bytes
-838:59:59 a 838:59:59
HH:MM:SS
Um valor de hora ou duração.
YEAR
1 byte
1901 a 2155
AAAA
Um valor de ano.
DATETIME
8 bytes
1000-01-01 00:00:00 a 9999-12-31 23:59:59
AAAA-MM-DD HH:MM:SS
Um valor combinado de data e hora.
NotaPara este tipo de dado, o mês e o dia devem ter dois dígitos. Por exemplo, especifique
2020-01-01em vez de2020-1-1. Caso contrário, a consulta falhará ao ser enviada para o OSS.TIMESTAMP
4 bytes
1970-01-01 00:00:00 a 2038-01-19 03:14:07
AAAA-MM-DD HH:MM:SS
Um carimbo de data/hora, que é um valor combinado de data e hora.
NotaPara este tipo de dado, o mês e o dia devem ter dois dígitos. Por exemplo, especifique
2020-01-01em vez de2020-1-1. Caso contrário, a consulta falhará ao ser enviada para o OSS.Tipos de string
Tipo
Tamanho
Descrição
CHAR
0 a 255 bytes
Uma string de comprimento fixo.
VARCHAR
0 a 65.535 bytes
Uma string de comprimento variável.
TINYBLOB
0 a 255 bytes
Uma string binária com comprimento máximo de 255 caracteres.
TINYTEXT
0 a 255 bytes
Uma string de texto curta.
BLOB
0 a 65.535 bytes
Dados de texto longo em formato binário.
TEXT
0 a 65.535 bytes
Dados de texto longo.
MEDIUMBLOB
0 a 16.777.215 bytes
Dados de texto de comprimento médio em formato binário.
MEDIUMTEXT
0 a 16.777.215 bytes
Dados de texto de comprimento médio.
LONGBLOB
0 a 4.294.967.295 bytes
Dados de texto extra grandes em formato binário.
LONGTEXT
0 a 4.294.967.295 bytes
Dados de texto extra grandes.
Valores NULL
Inserção
-
Insira um valor NULL em uma tabela externa do OSS.
Para inserir um valor NULL em uma tabela externa do OSS, especifique o marcador de valor NULL correspondente,
NULL_MARKER, ao criar a tabela. ONULL_MARKERde uma tabela externa do OSS tem como padrão NULL. Execute a instruçãoSHOW CREATE TABLEpara visualizar o marcador de valor NULL:SHOW CREATE TABLE t1;O seguinte resultado é retornado:
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | t1 | CREATE TABLE `t1` ( `id` int(11) DEFAULT NULL ) ENGINE=CSV DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800020204 NULL_MARKER='NULL' */ CONNECTION='server_name' | +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) -
Insira um valor NULL em um arquivo CSV.
Se você inserir
NULL_MARKERem um campo de um arquivo CSV eNULL_MARKERnão estiver entre aspas duplas, o PolarDB reconhecerá o valor como NULL.NotaCaso adicione aspas duplas ao redor de
NULL_MARKER, o PolarDB o reconhece como uma string. Consequentemente, não é possível usar a instruçãois_nullpara encontrar valores NULL, e um erro será reportado se o parâmetro atribuído ao valor NULL no arquivo CSV não corresponder ao tipo de dado do parâmetro correspondente na tabela externa do OSS.-
O
NULL_MARKERnão pode ser um valor numérico, uma string vazia ou conter qualquer um dos seguintes caracteres:",\n,\re,
Exemplo
Use a seguinte instrução para criar uma tabela externa do OSS:
CREATE TABLE `t1` ( `id` int(11) DEFAULT NULL, `name` varchar(20) DEFAULT NULL, `time` timestamp NULL DEFAULT NULL ) ENGINE=CSV NULL_MARKER='NULL' CONNECTION='server_name';Suponha que o arquivo de dados contenha o seguinte conteúdo:
1,"xiaohong","2022-01-01 00:00:00" NULL,"xiaoming","2022-02-01 00:00:00" 3,NULL,"2022-03-01 00:00:00" 4,"xiaowang",NULLA consulta à tabela externa do OSS retorna os seguintes dados:
SELECT * FROM t1; +------+----------+---------------------+ | id | name | time | +------+----------+---------------------+ | 1 | xiaohong | 2022-01-01 00:00:00 | | NULL | xiaoming | 2022-02-01 00:00:00 | | 3 | NULL | 2022-03-01 00:00:00 | | 4 | xiaowang | NULL | +------+----------+---------------------+
Leitura
Ao ler dados de um arquivo CSV, se um valor no arquivo for NULL e a coluna correspondente na tabela externa do OSS aceitar NULL, a coluna será definida como NULL.
-
Se um valor NULL for lido de um arquivo CSV para uma coluna definida como NOT NULL, ocorrerá um conflito. O resultado depende do modo SQL.
Se o
sql_modeestiver definido comoSTRICT_TRANS_TABLES, um erro será reportado.Se o
sql_modeestiver definido como um modo diferente deSTRICT_TRANS_TABLES, a coluna assumirá seu valor padrão definido. Se nenhum valor padrão estiver definido, ela assumirá o padrão do MySQL para seu tipo de dado. Para mais informações, consulte Valores padrão de tipos de dados. Um aviso também é retornado. Use o comandoSHOW WARNINGS;para visualizar os detalhes do aviso.
NotaUse o comando
SHOW VARIABLES LIKE "sql_mode";para visualizar o modo SQL atual. Você também pode acessar o console do PolarDB e modifique o parâmetrosql_modena página . Para mais informações, consulte Modificar parâmetros.Exemplo
Crie uma tabela externa do OSS chamada
tonde a colunaidesteja definida como NOT NULL e não tenha valor padrão.CREATE TABLE `t` ( `id` int(11) NOT NULL ) ENGINE=CSV CONNECTION="server_name";Suponha que o arquivo CSV
t.CSVcontenha o seguinte conteúdo:NULL 2Dois cenários podem ocorrer ao ler dados do arquivo CSV usando a tabela externa do OSS:
-
Se
sql_modeestiver definido comoSTRICT_TRANS_TABLES, execute o seguinte comando para consultar dados do arquivo CSV:SELECT * FROM t;A seguinte mensagem de erro é reportada:
ERROR 1364 (HY000): Field 'id' doesn't have a default value -
Se
sql_modeestiver definido como um modo diferente deSTRICT_TRANS_TABLES, execute o seguinte comando para consultar dados do arquivo CSV:SELECT * FROM t;O seguinte resultado é retornado:
+----+ | id | +----+ | 0 | | 2 | +----+ 2 rows in set, 1 warning (0.00 sec)No resultado, 0 é o valor padrão do MySQL. Execute o seguinte comando para visualizar a mensagem de aviso:
SHOW WARNINGS;O seguinte resultado é retornado:
+---------+------+-----------------------------------------+ | Level | Code | Message | +---------+------+-----------------------------------------+ | Warning | 1364 | Field 'id' doesn't have a default value | +---------+------+-----------------------------------------+ 1 row in set (0.00 sec)
Parâmetros
Visualize ou modifique os seguintes parâmetros na página no console do PolarDB:
|
Parâmetro |
Escopo |
Descrição |
|
loose_csv_oss_buff_size |
Sessão |
Define a quantidade de memória em bytes que uma única thread do OSS pode usar. O valor padrão é 134217728. Valores válidos: 4096 a 134217728 |
|
loose_csv_max_oss_threads |
Global |
Define o número máximo de threads simultâneas do OSS. O valor padrão é 1. Valores válidos: 1 a 100 |
A memória total máxima para o recurso do OSS é calculada como: loose_csv_max_oss_threads * loose_csv_oss_buff_size.
Para evitar problemas de falta de memória, a memória total para o recurso do OSS não deve exceder 5% da memória do nó atual.
Procedimento
Criar um servidor OSS
Crie um servidor OSS para adicionar informações de conexão e conectar-se ao OSS.
Por motivos de segurança, criar um servidor OSS é o único método suportado para se conectar ao OSS.
Versões mais recentes
Se o seu cluster de banco de dados atender a uma das seguintes condições, use a sintaxe abaixo:
A versão do kernel é MySQL 8.0.1 e a revisão é 8.0.1.1.28 ou posterior.
A versão do kernel é MySQL 8.0.2 e a revisão é 8.0.2.2.5 ou posterior.
CREATE SERVER <server_name>
FOREIGN DATA WRAPPER oss OPTIONS
(
[DATABASE '<my_database_name>',]
EXTRA_SERVER_INFO '{"oss_endpoint": "<my_oss_endpoint>","oss_bucket": "<my_oss_bucket>","oss_access_key_id": "<my_oss_access_key_id>","oss_access_key_secret": "<my_oss_access_key_secret>","oss_prefix":"<my_oss_prefix>","oss_sts_token":"<my_oss_sts_token>"}'
);
O parâmetro opcional
DATABASEequivale aoss_prefix. Recomendamos o uso deoss_prefix.-
Para usar o parâmetro
oss_sts_token, uma das seguintes condições deve ser atendida:A versão do kernel é MySQL 8.0.1 e a revisão é 8.0.1.1.29 ou posterior.
A versão do kernel é MySQL 8.0.2 e a revisão é 8.0.2.2.6 ou posterior.
A tabela a seguir descreve os parâmetros.
Parâmetro | Tipo | Obrigatório | Descrição |
server_name | String | Sim | O nome do servidor OSS. Nota Este parâmetro é global e deve ser único. O nome não diferencia maiúsculas de minúsculas e tem um comprimento máximo de 64 caracteres. Nomes com mais de 64 caracteres são truncados automaticamente. É possível especificar o nome do servidor OSS como uma string entre aspas. |
my_database_name | String | Não | O diretório no OSS que contém os arquivos de dados CSV. Nota Se ambos os parâmetros |
my_oss_endpoint | String | Sim | O endpoint para a região correspondente do OSS. Nota Se você acessar o banco de dados a partir de um host da Alibaba Cloud, use um endpoint interno, que contém "internal" em seu nome, para evitar tráfego de rede pública. Por exemplo, o endpoint interno para a região China (Hangzhou) é |
my_oss_bucket | String | Sim | O bucket do OSS onde os arquivos de dados estão armazenados. Crie esse bucket no OSS antecipadamente. Nota Para melhor desempenho, coloque o bucket do OSS e o cluster de banco de dados PolarDB na mesma zona de disponibilidade para reduzir a latência de rede. |
my_oss_access_key_id | String | Sim | O AccessKey ID de um usuário RAM ou de uma conta Alibaba Cloud. |
my_oss_access_key_secret | String | Sim | O AccessKey Secret de um usuário RAM ou de uma conta Alibaba Cloud. |
my_oss_prefix | String | Não | O diretório no OSS que contém os arquivos de dados CSV. |
my_oss_sts_token | String | Não | A credencial de acesso temporário STS. Nota
|
Versões anteriores
Se o seu cluster de banco de dados atender a uma das seguintes condições, use a sintaxe abaixo:
A versão do kernel é MySQL 8.0.1 e a revisão está entre 8.0.1.1.25.4 e 8.0.1.1.27.
A versão do kernel é MySQL 8.0.2 e a revisão está entre 8.0.2.2.1 e 8.0.2.2.4.
CREATE SERVER <server_name>
FOREIGN DATA WRAPPER oss OPTIONS
(
[DATABASE '<my_database_name>',]
EXTRA_SERVER_INFO '{"oss_endpoint": "<my_oss_endpoint>","oss_bucket": "<my_oss_bucket>","oss_access_key_id":"<my_oss_access_key_id>","oss_access_key_secret":"<my_oss_access_key_secret>"}'
);
Nesta versão, a sintaxe não suporta os parâmetros oss_prefix e oss_sts_token.
A tabela a seguir descreve os parâmetros.
Parâmetro | Tipo | Obrigatório | Descrição |
server_name | String | Sim | O nome do servidor OSS. Nota Este parâmetro é global e deve ser único. O nome não diferencia maiúsculas de minúsculas e tem um comprimento máximo de 64 caracteres. Nomes com mais de 64 caracteres são truncados automaticamente. É possível especificar o nome do servidor OSS como uma string entre aspas. |
my_database_name | String | Não | O nome do diretório no OSS que contém os arquivos de dados CSV. |
my_oss_endpoint | String | Sim | O endpoint para a região correspondente do OSS. Nota Se você acessar o banco de dados a partir de um host da Alibaba Cloud, use um endpoint interno, que contém "internal" em seu nome, para evitar tráfego de rede pública. Exemplo: |
my_oss_bucket | String | Sim | O bucket do OSS onde os arquivos de dados estão armazenados. Crie o bucket no OSS antecipadamente. |
my_oss_access_key_id | String | Sim | O AccessKey ID de um usuário RAM ou de uma conta Alibaba Cloud. |
my_oss_access_key_secret | String | Sim | O AccessKey Secret de um usuário RAM ou de uma conta Alibaba Cloud. |
Criar um servidor OSS requer a permissão SERVERS_ADMIN. Execute o comando SHOW GRANTS FOR <username>; para verificar se o usuário atual possui a permissão SERVERS_ADMIN. Atualmente, contas com altos privilégios têm essa permissão por padrão e podem concedê-la a contas com privilégios padrão.
Se você não tiver o privilégio
SERVERS_ADMIN, o seguinte erro será retornado:Access denied; you need (at least one of) the SERVERS_ADMIN OR SUPER privilege(s) for this operation.Caso utilize uma conta padrão sem o privilégio
SERVERS_ADMIN, uma conta com altos privilégios pode conceder o privilégio executando:GRANT SERVERS_ADMIN ON *.* TO.Se você tiver uma conta com altos privilégios, mas não possuir a permissão
SERVERS_ADMIN, acesse a página no console do PolarDB e redefina as permissões. Aguarde um período e verifique a conta com altos privilégios novamente. A conta receberá então a permissãoSERVERS_ADMIN. Se a conta com altos privilégios ainda não tiver a permissãoSERVERS_ADMINapós tentar essas etapas, abra um ticket para entrar em contato conosco ou busque nosso número de grupo no DingTalk.Uma conta com altos privilégios pode visualizar as informações do servidor OSS executando
SELECT Server_name, Extra_server_info FROM mysql.servers;. Por segurança, os valores dos parâmetrososs_access_key_ideoss_access_key_secretsão criptografados e não podem ser visualizados.
Carregar dados
Utilize a ferramenta de linha de comando ossutil para carregar arquivos CSV locais no Object Storage Service (OSS).
O diretório do OSS onde você carrega o arquivo CSV deve corresponder ao diretório especificado no parâmetro
DATABASEouoss_prefixdo servidor OSS.O nome do arquivo CSV carregado deve estar no formato
<foreign_table_name>.CSV, com a extensão.CSVem letras maiúsculas. Por exemplo, se a tabela externa do OSS for chamadat1, o arquivo CSV deve ser nomeadot1.CSV.Os campos de dados no arquivo CSV devem corresponder às colunas da tabela externa do OSS. Por exemplo, se a tabela externa do OSS
t1tiver uma única colunaiddo tipoINT, o arquivo CSV carregado também deve conter apenas um campoINT.Recomendamos carregar diretamente os arquivos de dados do seu banco de dados MySQL local e criar a tabela externa do OSS correspondente com base na definição da tabela.
Criar uma tabela externa do OSS
Após definir o servidor OSS, crie uma tabela externa do OSS no PolarDB para mapear um arquivo CSV no OSS. Exemplo:
CREATE TABLE <table_name> (create_definition,...) engine=csv connection="<connection_string>";
A connection_string consiste nas seguintes partes, unidas por uma barra (/):
O nome do servidor OSS.
-
(Opcional) O caminho para o arquivo de dados no OSS.
NotaO caminho do arquivo de dados é suportado apenas se uma das seguintes condições for atendida.
A versão do kernel é MySQL 8.0.1 e a revisão é 8.0.1.1.28 ou posterior.
A versão do kernel é MySQL 8.0.2 e a revisão é 8.0.2.2.5 ou posterior.
-
(Opcional) O nome do arquivo de dados.
NotaNão inclua o sufixo
.CSVno nome do arquivo de dados.Se você não especificar um nome de arquivo de dados, o arquivo OSS correspondente à tabela atual será
<current_table_name>.CSV. Se especificar um nome de arquivo de dados, o arquivo OSS correspondente será<specified_data_file_name>.CSV.Caso especifique o caminho para o arquivo de dados no OSS, também será necessário especificar o nome do arquivo de dados. Caso contrário, o sistema tratará o último segmento do caminho como o nome do arquivo.
Visualizar tabela externa do OSS
Depois que a tabela externa do OSS for criada, visualize sua definição executando SHOW CREATE TABLE <table_name>;. Verifique se o mecanismo da tabela é CSV (ou seja, ENGINE=CSV). Se não for, a versão do seu cluster de banco de dados PolarDB pode ser muito antiga para suportar o mecanismo OSS. Para mais informações, consulte Pré-requisitos.
Exemplo
CREATE TABLE t1 (id int) engine=csv connection="server_name/a/b/c/d/t1";
Este exemplo mostra a composição da connection_string:
Nome do servidor OSS:
server_name.Caminho para o arquivo de dados no OSS:
oss_prefix/a/b/c/d/.Arquivo de dados:
t1. O arquivo real ét1.CSV, mas o sufixo.CSVé omitido conforme necessário.
É possível especificar o arquivo de dados para a tabela externa do OSS apenas pelo nome. Por exemplo, na instrução a seguir, o PolarDB busca o arquivo t2.CSV no caminho oss_prefix no OSS.
CREATE TABLE t1 (id int) engine=csv connection="server_name/t2";
Consultar dados
Os exemplos a seguir consultam a tabela t1 criada nas etapas anteriores.
-- Count rows in the t1 table.
SELECT count(*) FROM t1;
-- Range query.
SELECT id FROM t1 WHERE id < 10 AND id > 1;
-- Point query.
SELECT id FROM t1 where id = 3;
-- Multi-table join.
SELECT id FROM t1 left join t2 on t1.id = t2.id WHERE t2.name like "%er%";
A tabela a seguir descreve erros comuns que podem ocorrer durante consultas de dados e suas soluções.
Se uma consulta retornar um aviso em vez de um erro, execute SHOW WARNINGS; para visualizar os detalhes do aviso.
Mensagem de erro | Causa | Solução |
OSS error: No corresponding data file on the OSS engine. | O arquivo de dados correspondente não foi encontrado no OSS. | Verifique se o arquivo de dados existe no caminho esperado no OSS.
|
There is not enough memory space for OSS transmission. Currently requested memory %d. | Memória insuficiente para a consulta do OSS. | Para resolver este erro:
|
ERROR 8054 (HY000): OSS error: error message : Couldn't connect to server.Failed connect to aliyun-mysql-oss.oss-cn-hangzhou-internal.aliyuncs.com:80; | O cluster de banco de dados não consegue se conectar ao servidor OSS. | Verifique se a instância de banco de dados e o bucket do OSS estão na mesma zona de disponibilidade.
|
Otimização de consulta
O mecanismo OSS melhora o desempenho da consulta enviando condições elegíveis para o mecanismo OSS remoto. Essa otimização é chamada de engine condition pushdown. As seguintes limitações se aplicam ao envio de condições:
Apenas arquivos de texto CSV codificados em UTF-8 são suportados.
-
Em instruções SQL, apenas os seguintes tipos de operadores e expressões aritméticas são suportados:
Operadores de comparação:
>,<,>=,<=,==Operadores lógicos:
LIKE,IN,AND,ORExpressões aritméticas:
+,-,*,/
Apenas consultas de arquivo único são suportadas. Consultas que usam cláusulas
JOIN,ORDER BY,GROUP BYouHAVINGnão são suportadas.A cláusula WHERE não pode conter operações de agregação. Por exemplo,
where max(age) > 100não é permitido.O número máximo de colunas é 1.000, e o comprimento máximo de um nome de coluna em uma instrução SQL é 1.024 bytes.
Em uma cláusula LIKE, até cinco curingas
%são suportados.Em uma cláusula IN, até 1.024 constantes são suportadas.
Para arquivos CSV, o tamanho máximo é 256 KB por linha e 256 KB por coluna.
O comprimento máximo de uma instrução SQL é 16 KB. A cláusula WHERE pode conter até 20 expressões, e uma consulta pode conter até 100 operações de agregação.
Este recurso está desativado por padrão. Para ativá-lo, execute o comando SET SESSION optimizer_switch='engine_condition_pushdown=on';.
Consultas que atendem a essas condições são enviadas para o mecanismo OSS. Verifique o plano de execução de uma tabela externa do OSS para ver quais condições foram enviadas.
-
Use
EXPLAINpara visualizar o plano de execução de uma tabela externa do OSS. Exemplo:EXPLAIN SELECT count(*) FROM `t1` WHERE `id` > 5 AND `id` < 100 AND `name` LIKE "%1%%%%%" GROUP BY `id` ORDER BY `id` DESC; +----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+----------------------------------------------------------------------------------------------------------------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+----------------------------------------------------------------------------------------------------------------------------------+ | 1 | SIMPLE | t1 | NULL | ALL | NULL | NULL | NULL | NULL | 15000 | 1.23 | Using where; With pushed engine condition ((`test`.`t1`.`id` > 5) and (`test`.`t1`.`id` < 100)); Using temporary; Using filesort | +----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+----------------------------------------------------------------------------------------------------------------------------------+ 1 row in set, 1 warning (0.00 sec)As condições após
With pushed engine conditionsão enviadas para o mecanismo OSS remoto. As condições restantes,nameeGROUP BY, não são enviadas e são executadas apenas no servidor OSS local. -
Use o formato
treepara visualizar o plano de execução de uma tabela externa do OSS. Exemplo:EXPLAIN FORMAT=tree SELECT SELECT count(*) FROM `t1` WHERE `id` > 5 AND `id` < 100 AND `name` LIKE "%1%%%%%" GROUP BY `id` ORDER BY `id` DESC; +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | EXPLAIN | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -> Sort: <temporary>.id DESC -> Table scan on <temporary> -> Aggregate using temporary table -> Filter: (t1.`name` like '%1%%%%%') (cost=1690.00 rows=185) -> Table scan on t1, extra ( engine conditions: ((t1.id > 5) and (t1.id < 100)) ) (cost=1690.00 rows=15000) | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)As condições após
engine conditions:são enviadas para o mecanismo OSS remoto. As condições restantes,nameeGROUP BY, não são enviadas e são executadas apenas no servidor OSS local.NotaSeu cluster deve estar executando PolarDB for MySQL 8.0.2 ou posterior. Confirme a versão do cluster seguindo as instruções em Consultar o número da versão.
-
Use o formato
JSONpara visualizar o plano de execução de uma tabela externa do OSS. Exemplo:EXPLAIN FORMAT=json SELECT count(*) FROM `t1` WHERE `id` > 5 AND `id` < 100 AND `name` LIKE "%1%%%%%" GROUP BY `id` ORDER BY `id` DESC; +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | EXPLAIN | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | { "query_block": { "select_id": 1, "cost_info": { "query_cost": "1875.13" }, "ordering_operation": { "using_filesort": false, "grouping_operation": { "using_temporary_table": true, "using_filesort": true, "cost_info": { "sort_cost": "185.13" }, "table": { "table_name": "t1", "access_type": "ALL", "rows_examined_per_scan": 15000, "rows_produced_per_join": 185, "filtered": "1.23", "engine_condition": "((`test`.`t1`.`id` > 5) and (`test`.`t1`.`id` < 100))", "cost_info": { "read_cost": "1671.49", "eval_cost": "18.51", "prefix_cost": "1690.00", "data_read_per_join": "146K" }, "used_columns": [ "id", "name" ], "attached_condition": "(`test`.`t1`.`name` like '%1%%%%%')" } } } } } | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set, 1 warning (0.00 sec)Da mesma forma, as condições no campo
engine_conditionsão enviadas para o mecanismo OSS remoto. As condições restantes,nameeGROUP BY, não são enviadas e são executadas apenas no servidor OSS local.
Se você receber o seguinte erro, isso indica que alguns caracteres no arquivo de dados do OSS são incompatíveis com o envio de condições do mecanismo.
OSS error: The current query does not support engine condition pushdown. You need to use NO_ECP() hint or set optimizer_switch = 'engine_condition_pushdown=OFF' to turn off the condition push down function.
Desative manualmente o envio de condições do mecanismo usando um hint ou optimizer_switch.
-
Hints
Use um hint para desativar o envio de condições do mecanismo para uma consulta específica. Por exemplo, para desativar o envio de condições do mecanismo para a tabela
t1:SELECT /*+ NO_ECP(t1) */ `j` FROM `t1` WHERE `j` LIKE "%c%" LIMIT 10; -
optimizer_switch
Use
optimizer_switchpara desativar o envio de condições do mecanismo para todas as consultas na sessão atual.SET SESSION optimizer_switch='engine_condition_pushdown=off'; # Disable engine condition pushdown for the current session.Para verificar o status do envio de condições do mecanismo na sessão atual, execute o seguinte comando:
select @@optimizer_switch;
Sincronizar informações do servidor OSS
O nó primário e os nós somente leitura em um cluster PolarDB compartilham um único servidor OSS, permitindo o acesso aos dados a partir de todos os nós. Essa sincronização sem bloqueios garante que as operações em cada nó permaneçam independentes.
Ao modificar as informações do servidor OSS, as alterações são sincronizadas com os nós somente leitura sem bloqueios. Se uma thread em um nó somente leitura mantiver um bloqueio no servidor OSS, essa sincronização poderá ser atrasada. Nesse caso, execute /*force_node='pi-bpxxxxxxxx'*/ flush privileges; ou /*force_node='pi-bpxxxxxxxx'*/flush table oss_foreign_table; para atualizar manualmente as informações do servidor OSS do nó somente leitura.