sql >> Databáze >  >> RDS >> Mysql

Jaké indexy pro zlepšení výkonu JOIN a GROUP BY

Tip pro profesionály Nepoužívejte SELECT * nebo SELECT table.* v dotazech citlivých na výkon. Místo toho vyberte podle názvu sloupce, které skutečně potřebujete použít

Tip pro profesionály MySQL má notoricky známé nestandardní rozšíření na GROUP BY které používáte a možná i zneužíváte. Přečti si tohle. https://dev.mysql.com/doc /refman/8.0/en/group-by-handling.html Pokud jste postupovali podle prvního profesionálního tipu, bylo by mnohem snazší postupovat podle druhého.

Tip pro profesionály Vyhněte se „vhazování“ spousty jednosloupcových indexů v naději, že urychlíte vaše dotazy. Místo toho vytvořte indexy, často složené indexy, které odpovídají potřebám vašeho skutečného dotazu. Přečtěte si toto https://use-the-index-luke.com .

Tip pro profesionály Using temporary; using filesort zobrazení ve výstupu EXPLAIN nemusí být nutně špatné. Jednoduše to znamená, že dotazovací stroj musí částečnou sadu výsledků uložit do mezipaměti, než ji vrátí. temporary věc není skutečná tabulka, je to struktura RAM. Pokud je tak velký, že zahltí RAM, MySQL to rozlije na disk. Ale váš ne.

Vše, co bylo řečeno, refaktorujme váš dotaz. Předpokládám, že chcete načíst řádky s největší idCartDATA hodnotu pro každý CartSplitData.SUPPLIERID .

Napišme to tedy jako dílčí dotaz.

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

Tento dotaz lze výrazně urychlit vložením složeného indexu do CartSplitData:(SUPPLIERID, IDCartDATA) .

Nyní přepišme váš hlavní dotaz, abyste našli řádky odpovídající ID v tomto dílčím dotazu.

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'

Váš index na CartData.CartOrderref pomůže tomuto vnějšímu dotazu, stejně jako vytvořený složený index ^^^.




  1. Nejlepší skupiny na Facebooku pro Analytics, Big Data, Data Mining, Hadoop, NoSQL, Data Science

  2. Extrahování z velkého xml dotazu selhává s příliš dlouhým řetězcovým literálem

  3. jak vypočítat zbývající zbývající čas pomocí php a mysql?

  4. Jak vyřešit InnoDB:Nelze uzamknout chybu mysql ./ibdata1?