sql >> Databasteknik >  >> RDS >> Mysql

Vilka index för att förbättra prestanda för JOIN och GROUP BY

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




  1. Är detta det bästa sättet att skapa ett revisionsspår?

  2. Infoga om det inte finns Oracle

  3. MySQL:Använder DATETIME som primärnyckel

  4. Automatiserad testning av uppgraderingsprocessen för PostgreSQL