Suggerimento da professionista Evita SELECT *
o SELECT table.*
nelle query sensibili alle prestazioni. Seleziona invece, per nome, le colonne che devi effettivamente utilizzare
Suggerimento da professionista MySQL ha una famigerata estensione non standard per GROUP BY
che stai usando, e possibilmente abusando. Leggi questo. https://dev.mysql.com/doc /refman/8.0/en/group-by-handling.html
Se hai seguito il primo consiglio da professionista, seguire il secondo sarebbe molto più semplice.
Suggerimento da professionista Evita di "inserire" molti indici a colonna singola nella speranza di accelerare le tue query. Invece, crea indici, spesso composti, corrispondenti alle esigenze della tua query effettiva. Leggi questo https://use-the-index-luke.com .
Suggerimento da professionista Using temporary; using filesort
che appare nell'output EXPLAIN non è necessariamente negativo. Significa semplicemente che il motore di query deve memorizzare nella cache un set di risultati parziale prima di restituirlo. Il temporary
cosa non è una tabella reale, è una struttura RAM. Se è così grande da inondare la RAM, MySQL la riverserà su disco. Ma il tuo no.
Detto questo, riformuliamo la tua query. Immagino tu voglia recuperare le righe con il idCartDATA
più grande valore per ogni CartSplitData.SUPPLIERID
.
Quindi scriviamolo come una sottoquery.
SELECT max(IDCartDATA) AS IDCartDATA, SUPPLIERID
FROM CartSplitData
GROUP BY SUPPLIERID
Questa query può essere accelerata, notevolmente, inserendo un indice composto su CartSplitData:(SUPPLIERID, IDCartDATA)
.
Quindi, riscriviamo la tua query principale per trovare le righe corrispondenti agli ID in quella sottoquery.
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'
Il tuo indice su CartData.CartOrderref
aiuterà questa query esterna, così come l'indice composto creato ^^^.