sql >> Database teknologi >  >> RDS >> Mysql

Optimer VÆLG ... HVOR I (...)

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

Sæt først et indeks på prodid se @Anthonys svar.

Ændr derefter forespørgslen til at læse:

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

Hvis du sørger for at din IN listen er sorteret stigende, før den tilbydes til IN klausulen, order by prodid vil give det samme resultat som order by field(...

  • Brug af en funktion i stedet for et felt dræber enhver chance for at bruge et indeks, hvilket forårsager langsommelighed.
  • select * henter data, du måske ikke har brug for, hvilket forårsager ekstra diskadgang og ekstra hukommelsesforbrug og ekstra netværkstrafik.
  • På InnoDB, hvis du kun select indekserede felter, vil MySQL aldrig læse tabellen, men kun indeksbesparelsen (i dit tilfælde er dette sandsynligvis ikke et problem)

Der er et par tricks, du kan bruge.

  • Hvis produkttabellen ikke er for stor, kan du gøre den til en memory tabel, som er gemt i RAM. Gør ikke dette for store borde, det vil bremse andre ting.
    Du kan kun bruge hash indekser på hukommelsestabeller.
  • Hvis prodid'erne er kontinuerlige, kan du bruge BETWEEN 1000 AND 1019 i stedet for
    IN (1000, 1001 ..., 1019)


  1. Udviklingen og fremtiden for Microsoft Access

  2. Opret MySQL-lagret procedure ved hjælp af JPA Hibernate

  3. Tilslutning af en 32-bit applikation til jBASE

  4. FieldShield SDK