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

Optimalizovat SELECT ... WHERE IN (...)

SELECT * FROM  products                         <<-- select * is non-optimal
WHERE  prodid in (10331,11639,12127..) 
ORDER BY Field(prodid, 10331,11639,12127...);   <<-- your problem is here

Nejprve vložte index na prodid viz odpověď @Anthony.

Poté změňte dotaz na čtení:

SELECT only,the,fields,you,need FROM  products
WHERE  prodid in (10331,11639,12127..) 
ORDER BY prodid

Pokud se ujistíte, že jste IN seznam je seřazen vzestupně, než jej nabídne IN klauzule, order by prodid přinese stejný výsledek jako order by field(...

  • Použití funkce místo pole zabíjí jakoukoli šanci na použití indexu, což způsobuje pomalost.
  • select * načte data, která možná nepotřebujete, což způsobí další přístup k disku a další využití paměti a další síťový provoz.
  • Na InnoDB, pokud pouze select indexovaná pole, MySQL nikdy nepřečte tabulku, ale pouze čas úspory indexu (ve vašem případě to však pravděpodobně není problém)

Existuje několik triků, které můžete použít.

  • Pokud není tabulka produktů příliš velká, můžete z ní vytvořit memory tabulky, která je uložena v paměti RAM. Nedělejte to u velkých stolů, zpomalí to ostatní věci.
    Můžete použít pouze hash indexy na paměťových tabulkách.
  • Pokud jsou prodidy souvislé, můžete použít BETWEEN 1000 AND 1019 místo
    IN (1000, 1001 ..., 1019)


  1. Azure Virtual Machine Development pro použití SQL Server

  2. Důsledky nastavení hodnoty sloupce MySQL na NULL místo 0 nebo '' na místo na disku

  3. Implementace Optimistic Locking v Oracle

  4. Dokážete VYBRAT všechno, kromě 1 nebo 2 polí, bez spisovatelské křeče?