sql >> Database >  >> RDS >> Mysql

Welke indexen om de prestaties van JOIN en GROUP BY . te verbeteren

Pro-tip Vermijd SELECT * of SELECT table.* in prestatiegevoelige zoekopdrachten. Selecteer in plaats daarvan op naam de kolommen die u echt moet gebruiken

Pro-tip MySQL heeft een beruchte niet-standaard extensie voor GROUP BY die u gebruikt en mogelijk misbruikt. Lees dit. https://dev.mysql.com/doc /refman/8.0/en/group-by-handling.html Als je de eerste professionele tip zou volgen, zou het volgen van de tweede veel gemakkelijker zijn.

Pro-tip Vermijd het "erin gooien" van veel indexen met één kolom in de hoop uw zoekopdrachten te versnellen. Maak in plaats daarvan indexen, vaak samengestelde indexen, die overeenkomen met de behoeften van uw daadwerkelijke zoekopdracht. Lees deze https://use-the-index-luke.com .

Pro-tip Using temporary; using filesort verschijnen in EXPLAIN-uitvoer is niet per se slecht. Het betekent gewoon dat de query-engine een gedeeltelijke resultatenset in de cache moet opslaan voordat deze wordt geretourneerd. De temporary ding is geen echte tabel, het is een RAM-structuur. Als het zo groot is dat het RAM overspoelt, zal MySQL het op schijf morsen. Maar de jouwe niet.

Dat gezegd hebbende, laten we uw zoekopdracht herformuleren. Ik neem aan dat je de rijen wilt ophalen met de grootste idCartDATA waarde voor elke CartSplitData.SUPPLIERID .

Laten we dat dus als een subquery schrijven.

                  SELECT max(IDCartDATA) AS IDCartDATA, SUPPLIERID
                    FROM CartSplitData
                   GROUP BY SUPPLIERID

Deze zoekopdracht kan drastisch worden versneld door een samengestelde index op CartSplitData te plaatsen:(SUPPLIERID, IDCartDATA) .

Laten we vervolgens uw hoofdquery herschrijven om de rijen te vinden die overeenkomen met de ID's in die subquery.

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'

Uw index op CartData.CartOrderref zal deze buitenste query helpen, net als de samengestelde index die is gemaakt ^^^.




  1. Onthoud dit bij het formatteren van een TIME-gegevenstype in SQL Server (T-SQL)

  2. mySQL:Subquery naar array?

  3. PostgreSQL onjuiste sortering

  4. Een SQL-query schrijven om een ​​item uit de volgende tabel te SELECTEREN