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

Hvilke indekser for at forbedre ydeevnen af ​​JOIN og GROUP BY

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




  1. Undgå denne almindelige fejl, når du udfører lagret procedure i MS Access

  2. StarJoinInfo i udførelsesplaner

  3. node-mysql flere udsagn i én forespørgsel

  4. Skift adgangskoden på SA-login i SQL Server (T-SQL-eksempel)