Estou usando o MySQL 8.0.32. Tenho algumas perguntas sobre uma conversão interna, que não entendo. Além disso, às vezes essa conversão é mostrada em SHOW FULL PROCESSLIST, pois sua execução era muito longa.
Esta é a minha mesa.
CREATE TABLE `provinces` (
`ID` VARCHAR(2) NOT NULL COLLATE 'utf8mb4_swedish_ci',
`PROVINCIA` VARCHAR(45) NOT NULL COLLATE 'utf8mb4_swedish_ci',
PRIMARY KEY (`ID`)
) COLLATE='utf8mb4_swedish_ci' ENGINE=InnoDB;
Eu tenho 53 linhas como essas
EU IA | PROVÍNCIA |
---|---|
01 | Álava |
02 | Albacete |
A função MySQL é:
CREATE FUNCTION `get_provincia`( `id_provincia` VARCHAR(2) )
RETURNS varchar(45)
LANGUAGE SQL
NOT DETERMINISTIC
READS SQL DATA
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE desc_provincia VARCHAR(45) DEFAULT '-';
SELECT PROVINCIA INTO desc_provincia
FROM provinces
WHERE ID = id_provincia;
RETURN desc_provincia;
END
O SHOW STATUS desta função mostra:
- character_set_client: utf8mb4
- conexão_de_agrupamento: utf8mb4_0900_ai_ci
- database_collation: latin1_swedish_ci
Essa função é invocada como um campo em uma consulta.
SELECT customer_id, customer_name, ..., get_provincia(SUBSTRING(zip_code,1,2))...
FROM ...
Quando estou revisando a execução com SHOW FULL PROCESSLIST, a consulta dentro da função é mostrada assim:
SELECT provincia INTO desc_provincia
FROM provincias
WHERE id = NAME_CONST('id_provincia',_latin1'15' COLLATE 'latin1_swedish_ci')
Então, eu tenho essas perguntas:
- Por que o NAME_CONST é forçado pelo MySQL?
- Isso tem impacto no desempenho? Não entendo que uma consulta muito simples mostre o valor "2" na coluna "Time" do comando SHOW FULL PROCESSLIST, pois demora 2 segundos.
Desde já, obrigado.
Testei seu exemplo na versão MySQL
8.0.39-0ubuntu0.22.04.1
.Criei a seguinte função
Um script bash simples para capturar a
SHOW FULL PROCESSLIST
saídaExecutando a consulta
produzido
Devido à incompatibilidade de ordenação entre a tabela de províncias que usa utf8mb4_swedish_ci e os parâmetros de consulta que usam latin1_swedish_ci devido à configuração de ordenação do banco de dados latin1_swedish_ci.
Normalmente, cada conversão de agrupamento afeta o desempenho, como vemos em JOINS etc.
O que eu sugiro?
Modifique o parâmetro da função a ser usada
utf8mb4_swedish_ci
e sempre use a mesma ordenação, se possível.Depois de executar a mesma consulta SELECT acima, o
SHOW FULL PROCESSLIST
resultado é