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

Jakie indeksy poprawiają wydajność funkcji JOIN i GROUP BY

Wskazówka dla profesjonalistów Unikaj SELECT * lub SELECT table.* w zapytaniach wrażliwych na wydajność. Zamiast tego wybierz według nazwy kolumny, których faktycznie potrzebujesz

Wskazówka dla profesjonalistów MySQL ma znane niestandardowe rozszerzenie do GROUP BY którego używasz i prawdopodobnie nadużywasz. Przeczytaj to. https://dev.mysql.com/doc /refman/8.0/en/group-by-handling.html Jeśli zastosujesz się do pierwszej wskazówki dla profesjonalistów, podążanie za drugą byłoby znacznie łatwiejsze.

Wskazówka dla profesjonalistów Unikaj „wrzucania” wielu indeksów jednokolumnowych w nadziei na przyspieszenie zapytań. Zamiast tego utwórz indeksy, często indeksy złożone, odpowiadające potrzebom Twojego zapytania. Przeczytaj ten https://use-the-index-luke.com .

Wskazówka dla profesjonalistów Using temporary; using filesort pojawiające się na wyjściu EXPLAIN niekoniecznie są złe. Oznacza to po prostu, że aparat zapytań musi buforować częściowy zestaw wyników przed jego zwróceniem. temporary rzecz nie jest rzeczywistą tabelą, to struktura pamięci RAM. Jeśli jest tak duży, że zasypuje pamięć RAM, MySQL wyrzuci go na dysk. Ale twój nie jest.

Biorąc to wszystko pod uwagę, zrefaktoryzujmy zapytanie. Chyba chcesz pobrać wiersze z największymi idCartDATA wartość dla każdego CartSplitData.SUPPLIERID .

Napiszmy to więc jako podzapytanie.

                  SELECT max(IDCartDATA) AS IDCartDATA, SUPPLIERID
                    FROM CartSplitData
                   GROUP BY SUPPLIERID

To zapytanie można znacznie przyspieszyć, umieszczając indeks złożony w CartSplitData:(SUPPLIERID, IDCartDATA) .

Następnie przepiszmy główne zapytanie, aby znaleźć wiersze pasujące do identyfikatorów w tym podzapytaniu.

SELECT CartData.*             /* * hammers performance */
       CartSplitData.*        /* * hammers performance */
  FROM CartData
  JOIN CartSplitData ON CartSplitData.IDCartDATA = CartDATA.IDCartData
  JOIN (
                  SELECT max(IDCartDATA) AS IDCartDATA, SUPPLIERID
                    FROM CartSplitData
                   GROUP BY SUPPLIERID
       )x ON x.SUPPLIERID = CartSplitData.SUPPLIERID
         AND x.IDCartData = CartSplitData.IDCartData
 WHERE CartData.CartOrderref = 'XXXXXXXXX'

Twój indeks na CartData.CartOrderref pomoże to zewnętrzne zapytanie, podobnie jak utworzony indeks złożony ^^^.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. hibernate, mysql, glassfish v3 i źródło danych JTA

  2. Znajdowanie dokładnej wartości z ciągu oddzielonego przecinkami w PHP MySQL

  3. Jak zmienić zduplikowane wiersze na unikalne wartości w mysql?

  4. Jak mogę sprawdzić, czy istnieje tabela MySQL z PHP?

  5. Wyzwalacz MySQL przed usunięciem, aby uniknąć usuwania wielu wierszy