Mysql
 sql >> Database >  >> RDS >> Mysql

Quali indici per migliorare le prestazioni di JOIN e GROUP BY

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