sql >> Databáze >  >> RDS >> Mysql

Rychlost klíčového slova IN v MySQL/PostgreSQL

V PostgreSQL přesně to, co zde získáte, závisí na základní tabulce, takže byste měli použít EXPLAIN ANALYZE na některé vzorové dotazy na užitečnou podmnožinu vašich dat, abyste zjistili, co přesně optimalizátor udělá (ujistěte se, že tabulky, které 'proti byly také analyzovány). IN lze zpracovat několika různými způsoby, a proto se musíte podívat na některé vzorky, abyste zjistili, která alternativa se pro vaše data používá. Na vaši otázku neexistuje jednoduchá obecná odpověď.

Pokud jde o konkrétní otázku, kterou jste přidali ve své revizi, v porovnání s triviální sadou dat bez zahrnutých indexů zde je příklad dvou plánů dotazů, které získáte:

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

Tyto dva běhové moduly jsou v podstatě totožné, protože reálnému času zpracování dominuje sekvenční prohledávání tabulky; vícenásobné spuštění ukazuje, že rozdíl mezi těmito dvěma je pod hranicí chyb mezi spuštěním a spuštěním. Jak můžete vidět, PostgreSQL transformuje případ IN na použití svého filtru ANY, který by se měl vždy provádět rychleji než série OR. Tento triviální případ opět nemusí nutně reprezentovat to, co uvidíte u vážného dotazu, kde se jedná o indexy a podobně. Bez ohledu na to by ruční nahrazení IN sérií příkazů OR nemělo být nikdy rychlejší, protože optimalizátor ví, co je nejlepší udělat, pokud má dobrá data pro práci.

PostgreSQL obecně zná více triků, jak optimalizovat komplikované dotazy, než optimalizátor MySQL, ale také hodně spoléhá na to, že optimalizátoru poskytnete dostatek dat, se kterými bude pracovat. První odkazy v sekci "Optimalizace výkonu" na PostgreSQL wiki pokrývají nejdůležitější věci potřebné k získání dobrých výsledků s optimalizátorem.



  1. Poddotaz SQLite

  2. mysql nemůže vložit záznam s nepodepsaným primárním klíčem nula

  3. SQL Injection na BadStore

  4. SQL Injection v Javě a MySQL při použití více dotazů