Prof tip Undgå SELECT *
eller SELECT table.*
i præstationsfølsomme forespørgsler. Vælg i stedet, efter navn, de kolonner, du faktisk skal bruge
Prof tip MySQL har en notorisk ikke-standard udvidelse til GROUP BY
som du bruger og muligvis misbruger. Læs dette. https://dev.mysql.com/doc /refman/8.0/da/group-by-handling.html
Hvis du fulgte det første pro-tip, ville det være meget nemmere at følge det andet.
Prof tip Undgå at "smide ind" masser af enkeltkolonneindekser i håb om at fremskynde dine forespørgsler. Opret i stedet indekser, ofte sammensatte indekser, der matcher behovene for din faktiske forespørgsel. Læs denne https://use-the-index-luke.com .
Prof tip Using temporary; using filesort
vises i EXPLAIN-output er ikke nødvendigvis dårligt. Det betyder simpelthen, at forespørgselsmotoren skal cache et delvist resultatsæt, før det returneres. Den temporary
ting er ikke en egentlig tabel, det er en RAM-struktur. Hvis det er så stort, at det fylder RAM, vil MySQL spilde det til disken. Men det er din ikke.
Når det er sagt, lad os refaktorisere din forespørgsel. Jeg gætter på, at du vil hente rækkerne med den største idCartDATA
værdi for hver CartSplitData.SUPPLIERID
.
Så lad os skrive det som en underforespørgsel.
SELECT max(IDCartDATA) AS IDCartDATA, SUPPLIERID
FROM CartSplitData
GROUP BY SUPPLIERID
Denne forespørgsel kan fremskyndes dramatisk ved at sætte et sammensat indeks på CartSplitData:(SUPPLIERID, IDCartDATA)
.
Lad os derefter omskrive din hovedforespørgsel for at finde de rækker, der matcher id'erne i den underforespørgsel.
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'
Dit indeks på CartData.CartOrderref
vil hjælpe denne ydre forespørgsel, ligesom det sammensatte indeks, der er oprettet ^^^.