sql >> Database >  >> RDS >> Mysql

PDO-verklaring duurt 400x langer dan MySQL CLI

Ik vermoed dat de traagheid zit in het ophalen van de rijen, het aantal rijen dat wordt geretourneerd, in plaats van de 5000+ tijdelijke aanduidingen voor binden in de instructie. pId IN ( ? , ? , ... , ? )

Mijn suggestie zou zijn om te testen dat er slechts één rij wordt geretourneerd, één waarde opgeeft waarvan bekend is dat deze bestaat/een rij retourneert en vervolgens 4999+ waarden waarvan bekend is dat ze niet bestaan/geen rij retourneert.

Als we bijvoorbeeld de hoogste pId-waarde in de tabel kennen, gebruik dan hogere waarden, geef bindingswaarden op voor een instructie als deze

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

dus het resultaat zou gelijk zijn aan hardlopen

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

wat hetzelfde resultaat zou zijn als we zouden krijgen

 ... pId IN ( 42 )

Onze verwachting zou zijn om slechts één rij terug te geven ( pId =42).

Vergelijk vervolgens de timing daarvan ( 5000+ bindwaarden die 1 rij teruggeven) met twee bindwaarden die een enkele rij teruggeven

 ... pId IN ( 99999999 , 42 )

En kijk of er een significant verschil in prestatie is.

(Er is meer werk te doen met 5000+ bindwaarden, maar ik zou geen enorme verwachten verschil, maar het moet worden getest.

Als je er even over nadenkt, is het misschien makkelijker om een ​​test op te zetten met alle bestaande bindingswaarden en gewoon LIMIT 2 toe te voegen. tot het einde van de zoekopdracht. (Ik weet niet zeker of MySQL prestatieverbeteringen heeft voor LIMIT 2 .

Het is misschien beter om een ​​voorwaarde toe te voegen zoals AND pId * 10 = 420

Het doel is om een ​​hele reeks bindingswaarden te leveren, maar slechts één of twee rijen terug te geven.

Een andere test zou zijn om een ​​hele reeks rijen te retourneren, maar met slechts een paar bindingswaarden. Misschien een bereikvoorwaarde die 5000+ rijen retourneert.

De vraag zou kunnen zijn:

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

met een voldoende groot bereik tussen de opgegeven waarden die we krijgen in de buurt van 5000 rijen.

En vergelijk prestaties.

Mijn voorspelling (denk ik?) is dat de prestaties meer gecorreleerd zullen zijn met het aantal geretourneerde rijen dan met het aantal bindingswaarden.

Ik weet niet zeker of dit een antwoord op uw vraag is, maar het is de benadering die ik zou nemen om de vraag te beantwoorden ... "waardoor is dit traag, het aantal bindingswaarden of het aantal geretourneerde rijen? "




  1. Exporteer SQLite-database naar een CSV-bestand

  2. SQL Server Express-alternatieven boven de limiet van 2 GB

  3. Hoe de laatste rij per groep te krijgen in PostgreSQL

  4. Hoe kan je met Rails meerdere statements in één query uitvoeren?