sql >> Databasteknik >  >> RDS >> Mysql

PDO-utlåtande tar 400 gånger längre än MySQL CLI

Jag misstänker att långsamheten ligger i att hämta raderna, antalet rader som returneras, snarare än de 5000+ binda platshållarna i uttalandet. pId IN ( ? , ? , ... , ? )

Mitt förslag skulle vara att testa att endast returnera en enstaka rad, ange ett värde som är känt för att existera/returnera en rad, och sedan 4999+ värden som är kända för att inte existera/inte returnera en rad.

Om vi ​​till exempel känner till det högsta pId-värdet i tabellen, använd värden högre än det, ange bindningsvärden för ett påstående som detta

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

så resultatet skulle vara likvärdigt med att köra

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

vilket skulle vara samma resultat som vi skulle köra

 ... pId IN ( 42 )

Vår förväntning skulle vara att bara returnera en rad ( pId =42 ).

Jämför sedan tidpunkten för det ( 5000+ bindningsvärden returnerar 1 rad ) med två bindningsvärden som returnerar en enda rad

 ... pId IN ( 99999999 , 42 )

Och se om det finns en signifikant skillnad i prestanda.

(Det finns mer arbete att göra med 5000+ bindningsvärden, men jag skulle inte förvänta mig en stor skillnad, men det bör testas.

Om du tänker på det lite, kan det vara lättare att ställa in ett test med alla befintliga bindningsvärden och bara lägga till LIMIT 2 till slutet av frågan. (Jag är inte säker på om MySQL har några prestandaförbättringar för LIMIT 2 .

Det kanske är bättre att lägga till ett villkor som AND pId * 10 = 420

Målet är att tillhandahålla en hel rad bindningsvärden men bara returnera en eller två rader.

Ett annat test skulle vara att returnera en hel rad rader, men med bara ett par bindningsvärden. Kanske ett intervallvillkor som returnerar 5000+ rader.

Frågan kan vara:

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

med ett tillräckligt stort intervall mellan de angivna värdena som vi får i närheten av 5000 rader.

Och jämför prestanda.

Min förutsägelse (gissning?) är att prestanda kommer att korreleras mer med antalet returnerade rader snarare än antalet bindningsvärden.

Jag är inte säker på om detta är ett svar på din fråga, men det är det tillvägagångssätt som jag skulle ta för att svara på frågan ... "vad är det som gör att detta går långsamt, antalet bindningsvärden eller antalet returnerade rader? "




  1. Okänd kolumn '' i 'fältlista'. Django

  2. Hur skickar man XML från C# till en lagrad procedur i SQL Server 2008?

  3. Trunkering av alla tabeller i en Postgres-databas

  4. Mysql count returnerar noll om ingen post hittas