sql >> Databasteknik >  >> RDS >> Mysql

Hastighet för IN-nyckelord i MySQL/PostgreSQL

I PostgreSQL beror exakt vad du får här på den underliggande tabellen, så du bör använda EXPLAIN ANALYZE på några exempelfrågor mot en användbar delmängd av dina data för att ta reda på exakt vad optimeraren ska göra (se till att tabellerna du de kör mot har också analyserats). IN kan behandlas på ett par olika sätt, och det är därför du behöver titta på några exempel för att ta reda på vilket alternativ som används för din data. Det finns inget enkelt allmänt svar på din fråga.

När det gäller den specifika frågan du lade till i din revidering, mot en trivial datamängd utan index inblandade här är ett exempel på de två frågeplanerna som du får:

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

Dessa två körtider är i huvudsak identiska, eftersom den verkliga bearbetningstiden domineras av den sekventiella skanningen över bordet; att köra flera gånger visar att skillnaden mellan de två är lägre än felmarginalen för körning. Som du kan se omvandlar PostgreSQL IN-fallet till att använda dess ALLA-filter, som alltid ska köras snabbare än en serie ELLER. Återigen, detta triviala fall är inte nödvändigtvis representativt för vad du kommer att se på en seriös fråga där index och liknande är inblandade. Oavsett vilket bör det aldrig gå snabbare att manuellt ersätta IN med en serie ELLER-satser, eftersom optimeraren vet vad som är bäst att göra här om den har bra data att arbeta med.

I allmänhet kan PostgreSQL fler knep för hur man optimerar komplicerade frågor än vad MySQL-optimeraren gör, men den förlitar sig också mycket på att du har gett optimeraren tillräckligt med data att arbeta med. De första länkarna i avsnittet "Prestandaoptimering" i PostgreSQL-wikin täcker de viktigaste sakerna som behövs för att få bra resultat från optimeraren.



  1. Använda konfigurationstabeller för att definiera det faktiska arbetsflödet

  2. Oracle.ManagedDataAccess.EntityFramework - ORA-01918:användaren 'dbo' existerar inte

  3. Android SQlite uppdaterar inte data

  4. fråga för horisontell layout av mysql-data