SELECT * FROM products <<-- select * is non-optimal
WHERE prodid in (10331,11639,12127..)
ORDER BY Field(prodid, 10331,11639,12127...); <<-- your problem is here
Najpierw umieść indeks na prodid
zobacz odpowiedź @Anthony.
Następnie zmień zapytanie na:
SELECT only,the,fields,you,need FROM products
WHERE prodid in (10331,11639,12127..)
ORDER BY prodid
Jeśli upewnisz się, że Twój IN
lista jest sortowana rosnąco przed zaoferowaniem jej do IN
klauzula, order by prodid
da ten sam wynik w order by field(...
- Używanie funkcji zamiast pola zabija wszelkie szanse na użycie indeksu, powodując spowolnienie.
select *
pobierze dane, których możesz nie potrzebować, powodując dodatkowy dostęp do dysku, dodatkowe użycie pamięci i dodatkowy ruch w sieci.- W InnoDB, jeśli tylko
select
pola indeksowane, MySQL nigdy nie odczyta tabeli, a jedynie czas zaoszczędzenia indeksu (w twoim przypadku to jednak prawdopodobnie nie jest problem)
Jest kilka sztuczek, których możesz użyć.
- Jeśli tabela produktów nie jest zbyt duża, możesz ustawić ją jako
memory
tabela, która jest przechowywana w pamięci RAM. Nie rób tego dla dużych tabel, to spowolni inne rzeczy.
Możesz używać tylkohash
indeksy w tablicach pamięci. - Jeśli prodid są ciągłe, możesz użyć
BETWEEN 1000 AND 1019
zamiastIN (1000, 1001 ..., 1019)