Mysql
 sql >> Database >  >> RDS >> Mysql

Dichiarazione PDO che richiede 400 volte più tempo di MySQL CLI

Sospetto che la lentezza sia nel recuperare le righe, il numero di righe restituite, piuttosto che gli oltre 5000 segnaposto di associazione nell'istruzione. pId IN ( ? , ? , ... , ? )

Il mio suggerimento sarebbe di testare la restituzione di una sola riga, fornire un valore noto per l'esistenza/restituire una riga e quindi oltre 4999 valori di cui è noto l'inesistenza/non restituire una riga.

Ad esempio, se conosciamo il valore pId più alto nella tabella, utilizzare valori superiori a quello, fornire valori di collegamento per un'istruzione come questa

 ... pId IN ( ? , ? , ? , ... , ? )

quindi il risultato sarebbe equivalente a correre

 ... pId IN ( 99999999 , 99999998 , 99999997 , ... , 42 )

che sarebbe lo stesso risultato che otterremmo in esecuzione

 ... pId IN ( 42 )

La nostra aspettativa sarebbe quella di restituire solo una riga ( pId =42 ).

Quindi confronta la tempistica di ciò (oltre 5000 valori di associazione che restituiscono 1 riga) con due valori di associazione che restituiscono una singola riga

 ... pId IN ( 99999999 , 42 )

E verifica se c'è una differenza significativa nelle prestazioni.

(C'è più lavoro da fare con oltre 5000 valori di binding, ma non mi aspetterei un enorme differenza, ma dovrebbe essere testato.

Pensandoci un po', potrebbe essere più semplice impostare un test utilizzando tutti i valori di binding esistenti e aggiungendo semplicemente LIMIT 2 alla fine della domanda. (Non sono sicuro che MySQL abbia alcuni miglioramenti delle prestazioni per LIMIT 2 .

Forse è meglio aggiungere una condizione come AND pId * 10 = 420

L'obiettivo è fornire un'intera serie di valori di associazione ma restituire solo una o due righe.

Un altro test sarebbe restituire un'intera serie di righe, ma utilizzando solo un paio di valori di collegamento. Forse una condizione di intervallo che restituisce oltre 5000 righe.

La query potrebbe essere:

 ... pId >= ? AND pId <= ? 

con un intervallo sufficientemente ampio tra i valori forniti che otteniamo nell'intorno di 5000 righe.

E confronta le prestazioni.

La mia previsione (indovina?) è che le prestazioni saranno più correlate al numero di righe restituite, piuttosto che al numero di valori di binding.

Non sono sicuro che questa sia una risposta alla tua domanda, ma è l'approccio che prenderei per rispondere alla domanda ... "che cosa sta causando la lentezza, il numero di valori di binding o il numero di righe restituite? "