Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Instrução PDO demorando 400x mais que a CLI do MySQL


Suspeito que a lentidão esteja na busca das linhas, no número de linhas sendo retornadas, em vez dos mais de 5.000 marcadores de vínculo na instrução. pId IN ( ? , ? , ... , ? )

Minha sugestão seria testar o retorno de apenas uma única linha, fornecer um valor conhecido por existir/retornar uma linha e, em seguida, mais de 4999 valores conhecidos por não existir/não retornar uma linha.

Por exemplo, se soubermos o valor de pId mais alto na tabela, use valores mais altos que isso, forneça valores de ligação para uma instrução como esta
 ... pId IN ( ? , ? , ? , ... , ? )

então o resultado seria equivalente a executar
 ... pId IN ( 99999999 , 99999998 , 99999997 , ... , 42 )

que seria o mesmo resultado que obteríamos
 ... pId IN ( 42 )

Nossa expectativa seria retornar apenas uma linha ( pId =42 ).

Em seguida, compare o tempo disso (mais de 5000 valores de ligação retornando 1 linha) com dois valores de ligação retornando uma única linha
 ... pId IN ( 99999999 , 42 )

E veja se há uma diferença significativa no desempenho.

(Há mais trabalho a fazer com mais de 5.000 valores de ligação, mas eu não esperaria um enorme diferença, mas deve ser testado.

Pensando um pouco, pode ser mais fácil configurar um teste usando todos os valores de ligação existentes e apenas adicionando LIMIT 2 ao final da consulta. (Não tenho certeza se o MySQL tem alguns aprimoramentos de desempenho para LIMIT 2 .

Talvez seja melhor adicionar uma condição como AND pId * 10 = 420

O objetivo é fornecer uma grande quantidade de valores de ligação, mas retornar apenas uma ou duas linhas.

Outro teste seria retornar uma grande quantidade de linhas, mas usando apenas alguns valores de ligação. Talvez uma condição de intervalo que retorne mais de 5.000 linhas.

A consulta pode ser:
 ... pId >= ? AND pId <= ? 

com um intervalo grande o suficiente entre os valores fornecidos que obtemos na vizinhança de 5.000 linhas.

E compare o desempenho.

Minha previsão (adivinha?) é que o desempenho será mais correlacionado com o número de linhas retornadas, em vez do número de valores de associação.

Não tenho certeza se isso é uma resposta para sua pergunta, mas é a abordagem que eu tomaria para responder à pergunta ... "o que está causando lentidão, o número de valores de ligação ou o número de linhas retornadas? "