Proffstips Undvik SELECT *
eller SELECT table.*
i prestandakänsliga frågor. Välj istället, efter namn, de kolumner du faktiskt behöver använda
Proffstips MySQL har ett ökänt icke-standardtillägg till GROUP BY
som du använder och eventuellt missbrukar. Läs detta. https://dev.mysql.com/doc /refman/8.0/en/group-by-handling.html
Om du följde det första proffstipset skulle det vara mycket lättare att följa det andra.
Proffstips Undvik att "kasta in" massor av enstaka kolumnindex i hopp om att påskynda dina frågor. Skapa istället index, ofta sammansatta index, som matchar behoven för din faktiska fråga. Läs denna https://use-the-index-luke.com .
Proffstips Using temporary; using filesort
att visas i EXPLAIN-utdata är inte nödvändigtvis dåligt. Det betyder helt enkelt att frågemotorn måste cachelagra en delresultatuppsättning innan den returneras. Den temporary
sak är inte en faktisk tabell, det är en RAM-struktur. Om den är så stor att den tar emot RAM, kommer MySQL att spilla den till disken. Men din är det inte.
Allt som sagt, låt oss refaktorera din fråga. Jag antar att du vill hämta raderna med den största idCartDATA
värde för varje CartSplitData.SUPPLIERID
.
Så låt oss skriva det som en underfråga.
SELECT max(IDCartDATA) AS IDCartDATA, SUPPLIERID
FROM CartSplitData
GROUP BY SUPPLIERID
Den här frågan kan snabbas upp, dramatiskt, genom att sätta ett sammansatt index på CartSplitData:(SUPPLIERID, IDCartDATA)
.
Låt oss sedan skriva om din huvudfråga för att hitta raderna som matchar ID:n i den underfrågan.
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'
Ditt index på CartData.CartOrderref
kommer att hjälpa denna yttre fråga, liksom det sammansatta indexet som skapats ^^^.