sql >> Databasteknik >  >> RDS >> Mysql

Optimera VÄLJ ... VAR 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

Lägg först ett index på prodid se @Anthonys svar.

Ändra sedan frågan till att läsa:

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

Om du ser till att din IN listan sorteras stigande innan den erbjuds till IN satsen, order by prodid kommer att ge samma resultat som order by field(...

  • Att använda en funktion istället för ett fält dödar alla chanser att använda ett index, vilket orsakar långsamhet.
  • select * hämtar data som du kanske inte behöver, vilket orsakar extra diskåtkomst och extra minnesanvändning och extra nätverkstrafik.
  • På InnoDB, om du bara select indexerade fält, kommer MySQL aldrig att läsa tabellen, utan bara indexbesparingstiden (i ditt fall är detta förmodligen inte ett problem dock)

Det finns några knep du kan använda.

  • Om produkttabellen inte är för stor kan du göra den till ett memory tabell, som lagras i RAM. Gör inte detta för stora bord, det kommer att sakta ner andra saker.
    Du kan bara använda hash index på minnestabeller.
  • Om prodiderna är kontinuerliga kan du använda BETWEEN 1000 AND 1019 istället för
    IN (1000, 1001 ..., 1019)


  1. Den angivna nyckeln fanns inte i ordboken. med mysql

  2. Kryptera MySQL-trafik i skript

  3. verify_queryable_inventory returnerade ORA-20008:Timeout

  4. Lägg till ledande och efterföljande nollor i SQL Server