tem um problema com o MariaDB 10.2.12 rodando em aws rds (single master, sem slave)
quando executo a instrução preparada usando uma substituição de variável
PREPARE stmt1 FROM
"select ...quite complex select from tenth of tables..
and `subscribers`.`id` = ?
group by `subscribers`.`id`
limit 1";
SET @a = 77586744;
EXECUTE stmt1 USING @a;
DEALLOCATE PREPARE stmt1;
leva 13 minutos para processar (essas tabelas têm milhões de linhas)
no entanto, se eu executar a mesma consulta sem variáveis:
SET @sql = CONCAT("select ...quite complex select from tenth of tables..
and `subscribers`.`id` = ",77586744,"
group by `subscribers`.`id`
limit 1");
PREPARE stmt1 FROM @sql;
EXECUTE stmt1 ;
DEALLOCATE PREPARE stmt1;
ele só precisa de 0,05s para ser executado. O mesmo tempo que leva se eu não usar PREPARE.
De acordo com a saída do profiler, o longo prazo envolve várias "conversão de HEAP para Aria" com reindexação e classificação, que não ocorrem se nenhuma variável estiver envolvida.
Por que essa conversão acontece? parece que não falta tmp/heap, já que a consulta é executada em 0,05s, portanto, "USING variable" altera algo que não sei.
btw, enfrentamos o problema ao executar o aplicativo no PHP 7.1.20 com o Laravel Framework 5.6.39, então não posso simplesmente reescrever uma consulta para me livrar da "variável USING" como algo que acontece sob o capô do PDO.
UPD: EXPLAIN para consulta lenta
OK, a explicação é diferente, mas é meio que esperado da saída do perfilador. A coisa que eu ainda não entendo é por que ela difere enquanto a consulta permanece a mesma.
É
subscriber_tag
uma tabela de mapeamento muitos: muitos? Dito parasegmentation_tag
? Em caso afirmativo, pode haver várias maneiras de acelerar o uso em ambas as versões. Veja aqui .