Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Optymalizuj WYBIERZ... GDZIE W (...)

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ć tylko hash indeksy w tablicach pamięci.
  • Jeśli prodid są ciągłe, możesz użyć BETWEEN 1000 AND 1019 zamiast
    IN (1000, 1001 ..., 1019)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Połączyć się z dwiema różnymi bazami danych w PHP?

  2. Uczestnictwo w zapytaniu Streak MySQL

  3. Dostęp do MySQL z Pythona 3:Odmowa dostępu dla użytkownika

  4. Konwertuj zapisz/zaktualizuj szyny połączeń do sql

  5. Trafność wyszukiwania pełnotekstowego jest mierzona w?