sql >> Database >  >> RDS >> Mysql

Snelheid van IN-trefwoord in MySQL/PostgreSQL

In PostgreSQL hangt wat u hier precies krijgt af van de onderliggende tabel, dus u moet EXPLAIN ANALYZE gebruiken voor enkele voorbeeldquery's tegen een bruikbare subset van uw gegevens om erachter te komen wat de optimalisatie precies gaat doen (zorg ervoor dat de tabellen die u waar je tegenaan loopt, zijn ook ANALYSEERD). IN kan op een aantal verschillende manieren worden verwerkt, en daarom moet u enkele voorbeelden bekijken om erachter te komen welk alternatief voor uw gegevens wordt gebruikt. Er is geen eenvoudig algemeen antwoord op uw vraag.

Wat betreft de specifieke vraag die je in je revisie hebt toegevoegd, tegen een triviale dataset zonder dat er indexen bij betrokken zijn, is hier een voorbeeld van de twee queryplannen die je krijgt:

postgres=# explain analyze select * from x where s in ('123','456');
 Seq Scan on x  (cost=0.00..84994.69 rows=263271 width=181) (actual time=0.015..1819.702 rows=247823 loops=1)
   Filter: (s = ANY ('{123,456}'::bpchar[]))
 Total runtime: 1931.370 ms

postgres=# explain analyze select * from x where s='123' or s='456';
 Seq Scan on x  (cost=0.00..90163.62 rows=263271 width=181) (actual time=0.014..1835.944 rows=247823 loops=1)
   Filter: ((s = '123'::bpchar) OR (s = '456'::bpchar))
 Total runtime: 1949.478 ms

Die twee looptijden zijn in wezen identiek, omdat de echte verwerkingstijd wordt gedomineerd door de sequentiële scan over de tafel; meerdere keren uitvoeren geeft aan dat het verschil tussen de twee lager is dan de foutmarge voor run-to-run. Zoals je kunt zien, transformeert PostgreSQL de IN-case in het gebruik van het ANY-filter, dat altijd sneller moet worden uitgevoerd dan een reeks OR's. Nogmaals, dit triviale geval is niet per se representatief voor wat je zult zien bij een serieuze zoekopdracht waarbij indexen en dergelijke betrokken zijn. Hoe dan ook, het handmatig vervangen van IN's door een reeks OR-instructies zou nooit sneller moeten zijn, omdat de optimizer weet wat hij hier het beste kan doen als hij goede gegevens heeft om mee te werken.

Over het algemeen kent PostgreSQL meer trucs voor het optimaliseren van gecompliceerde zoekopdrachten dan de MySQL-optimizer, maar het is ook sterk afhankelijk van het feit dat u de optimizer voldoende gegevens hebt gegeven om mee te werken. De eerste links in de sectie "Prestatie-optimalisatie" van de PostgreSQL-wiki behandelen de belangrijkste dingen die nodig zijn om goede resultaten van de optimizer te krijgen.



  1. Microsoft Access gebruiken als front-end naar een MySQL-database?

  2. ongeldig karakter voor enkele aanhalingstekens voor sql-tekenreeks in java

  3. Afbeeldingen invoegen en ophalen in mysql via python

  4. Door de gebruiker gedefinieerde routine met DBMS_STATS, deel II