sql >> Database >  >> RDS >> Mysql

Doctrine Paginator selecteert hele tabel (erg traag)?

U moet uw zoekopdracht vereenvoudigen. Dat zou wat executietijd schelen. Ik kan je zoekopdracht niet testen, maar hier zijn een paar tips:

  • sorteer niet tijdens het uitvoeren van count()
  • u kunt sorteren op orderBy('p.id', 'DESC') , index zou worden gebruikt
  • in plaats van leftJoin() je zou join() . kunnen gebruiken als er altijd ten minste één record bestaat bij een samengevoegde tabel. Anders wordt dat record overgeslagen.
  • KNP/Paginator gebruikt DISTINCT() om alleen afzonderlijke records te lezen, maar dat kan leiden tot het gebruik van disk tmp-tabel
  • $query->getArrayResult() gebruikt de array-hidration-modus, die een multidimensionale array retourneert en het is veel sneller dan objecthidration voor een grote resultaatset
  • je zou gedeeltelijke select('partial p.{id, other used fields}') kunnen gebruiken , op deze manier zou je alleen benodigde velden laden, misschien niet-nederige relaties overslaan bij gebruik van objecthydratatie
  • controleer SF profiler UITLEG op een bepaalde vraag onder doctrine sectie, misschien worden indexen niet gebruikt
  • retourneert p.hashtags en p.likes slechts één rij of is oneToMany, wat het resultaat vermenigvuldigt
  • misschien wat wijzigingen in het ontwerp van Posts, waardoor sommige joins worden verwijderd:
    • heb het veld p.hashtags gedefinieerd als @ORM\Column(type="array") en hebben opgeslagen tekenreekswaarden van tags. Later misschien met behulp van volledige tekst zoeken op geserialiseerde array.
    • heb het veld p.likesCount gedefinieerd als @ORM\Column(type="integer") die het aantal likes zou hebben gehad

Ik gebruik KnpLabs/KnpPaginatorBundle en kunnen ook snelheidsproblemen hebben voor complexe vragen.

Gewoonlijk is het gebruik van LIMIT x,z traag voor DB, omdat het COUNT op de hele dataset draait. Als er geen indexen worden gebruikt, gaat het tergend langzaam.

Je zou een andere aanpak kunnen gebruiken en wat aangepaste paginering kunnen doen door ID-advancing, maar dat zou je aanpak bemoeilijken. Ik heb dit gebruikt met grote datasets zoals SYSLOG-tabellen. Maar je verliest de functionaliteit voor sorteren en totaal aantal records.



  1. Google Cloud SQL wordt zonder reden groter tot volledige schijf

  2. NameError:naam '_mysql' is niet gedefinieerd na wijziging in mysql

  3. Mysql json datatype count en groupby

  4. Hoe een HTML-tabel te compenseren met PHP om de celwaarde van de 1e rij af te trekken van de 2e rij celwaarde van verschillende kolommen