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 ^^^.