Mysql
 sql >> Datenbank >  >> RDS >> Mysql

PDO-Anweisung dauert 400-mal länger als die MySQL-CLI

Ich vermute, dass die Langsamkeit beim Abrufen der Zeilen, der Anzahl der zurückgegebenen Zeilen und nicht bei den über 5000 Bindungsplatzhaltern in der Anweisung liegt. pId IN ( ? , ? , ... , ? )

Mein Vorschlag wäre, nur eine einzelne Zeile zurückzugeben, einen Wert bereitzustellen, von dem bekannt ist, dass er existiert/eine Zeile zurückgibt, und dann 4999+ Werte, von denen bekannt ist, dass sie nicht existieren/eine Zeile nicht zurückgeben.

Wenn wir zum Beispiel den höchsten pId-Wert in der Tabelle kennen, verwenden Sie höhere Werte und geben Sie Bind-Werte für eine Anweisung wie diese an

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

das Ergebnis wäre also äquivalent zu running

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

was das gleiche Ergebnis wäre, das wir zum Laufen bekommen würden

 ... pId IN ( 42 )

Unsere Erwartung wäre, nur eine Zeile zurückzugeben ( pId =42 ).

Vergleichen Sie dann das Timing davon ( mehr als 5000 Bindungswerte, die 1 Zeile zurückgeben ) mit zwei Bindungswerten, die eine einzelne Zeile zurückgeben

 ... pId IN ( 99999999 , 42 )

Und prüfen Sie, ob es einen signifikanten Leistungsunterschied gibt.

(Bei mehr als 5000 Bindungswerten gibt es mehr Arbeit, aber ich würde keine riesigen erwarten Unterschied, sollte aber getestet werden.

Wenn Sie ein wenig darüber nachdenken, ist es möglicherweise einfacher, einen Test mit allen vorhandenen Bindungswerten einzurichten und einfach LIMIT 2 hinzuzufügen bis zum Ende der Abfrage. (Ich bin mir nicht sicher, ob MySQL einige Leistungsverbesserungen für LIMIT 2 hat .

Es ist vielleicht besser, eine Bedingung wie AND pId * 10 = 420 hinzuzufügen

Das Ziel ist es, eine ganze Reihe von Bind-Werten bereitzustellen, aber nur eine oder zwei Zeilen zurückzugeben.

Ein weiterer Test wäre, eine ganze Reihe von Zeilen zurückzugeben, aber nur ein paar Bind-Werte zu verwenden. Vielleicht eine Bereichsbedingung, die mehr als 5000 Zeilen zurückgibt.

Die Abfrage könnte lauten:

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

mit einer ausreichend großen Spannweite zwischen den bereitgestellten Werten, die wir in der Nähe von 5000 Zeilen erhalten.

Und vergleichen Sie die Leistung.

Meine Vorhersage (Vermutung?) ist, dass die Leistung eher mit der Anzahl der zurückgegebenen Zeilen als mit der Anzahl der Bindungswerte korreliert.

Ich bin mir nicht sicher, ob dies eine Antwort auf Ihre Frage ist, aber es ist der Ansatz, den ich wählen würde, um die Frage zu beantworten ... "Was führt dazu, dass dies langsam ist, die Anzahl der Bindungswerte oder die Anzahl der zurückgegebenen Zeilen? "