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
selectpola 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
memorytabela, która jest przechowywana w pamięci RAM. Nie rób tego dla dużych tabel, to spowolni inne rzeczy.
Możesz używać tylkohashindeksy w tablicach pamięci. - Jeśli prodid są ciągłe, możesz użyć
BETWEEN 1000 AND 1019zamiastIN (1000, 1001 ..., 1019)