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

PDO-erklæring tager 400x længere end MySQL CLI

Jeg formoder, at langsommeligheden ligger i at hente rækkerne, antallet af rækker, der returneres, snarere end de 5000+ bind-pladsholdere i erklæringen. pId IN ( ? , ? , ... , ? )

Mit forslag ville være at teste kun at returnere en enkelt række, angive en værdi, der vides at eksistere/returnere en række, og derefter 4999+ værdier, der vides ikke at eksistere/ikke returnere en række.

For eksempel, hvis vi kender den højeste pId-værdi i tabellen, skal du bruge værdier, der er højere end det, angive bindeværdier for en sætning som denne

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

så resultatet ville svare til at køre

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

hvilket ville være det samme resultat, som vi ville få til at køre

 ... pId IN ( 42 )

Vores forventning ville være at returnere kun én række ( pId =42 ).

Sammenlign derefter timingen af ​​det (5000+ bindeværdier returnerer 1 række) med to bindeværdier, der returnerer en enkelt række

 ... pId IN ( 99999999 , 42 )

Og se om der er en væsentlig forskel i ydeevnen.

(Der er mere arbejde at gøre med 5000+ bind-værdier, men jeg ville ikke forvente en enorm forskel, men det bør testes.

Når man tænker lidt på det, kan det være lettere at opsætte en test ved at bruge alle de eksisterende bindeværdier og blot tilføje LIMIT 2 til slutningen af ​​forespørgslen. (Jeg er ikke sikker på, om MySQL har nogle ydeevneforbedringer til LIMIT 2 .

Det er måske bedre at tilføje en betingelse som AND pId * 10 = 420

Målet er at levere en hel række bindeværdier, men kun returnere en eller to rækker.

En anden test ville være at returnere en hel række rækker, men kun ved at bruge et par bindeværdier. Måske en områdebetingelse, der returnerer 5000+ rækker.

Forespørgslen kunne være:

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

med et stort nok interval mellem de angivne værdier, som vi får i nærheden af ​​5000 rækker.

Og sammenlign ydeevne.

Min forudsigelse (gæt?) er, at ydeevnen vil være mere korreleret med antallet af returnerede rækker i stedet for antallet af bindeværdier.

Jeg er ikke sikker på, om dette er et svar på dit spørgsmål, men det er den tilgang, jeg ville tage for at besvare spørgsmålet ... "hvad er årsagen til, at dette er langsomt, antallet af bindingsværdier eller antallet af returnerede rækker? "




  1. Oracle venstre ydre joinforespørgsel

  2. Sådan fjerner du to dublerede kolonner

  3. Hvordan vælger man understreng i oracle?

  4. Hvordan fjerner jeg ikke-afbrydende mellemrum fra en kolonne i SQL-serveren?