sql >> データベース >  >> RDS >> Mysql

JOINとGROUPBYのパフォーマンスを向上させるためのインデックス

    プロのヒント SELECT *は避けてください またはSELECT table.* パフォーマンスに敏感なクエリで。代わりに、実際に使用する必要のある列を名前で選択してください

    プロのヒント MySQLには、GROUP BYに対する悪名高い非標準の拡張機能があります あなたが使用しているもの、そしておそらく誤用しているもの。これを読む。 https://dev.mysql.com/doc /refman/8.0/en/group-by-handling.html 最初のプロのヒントに従った場合、2番目のヒントに従う方がはるかに簡単です。

    プロのヒント クエリを高速化することを期待して、多数の単一列インデックスを「スローイン」することは避けてください。代わりに、実際のクエリのニーズに一致するインデックス(多くの場合、複合インデックス)を作成します。このhttps://use-the-index-luke.com をお読みください 。

    プロのヒント Using temporary; using filesort EXPLAIN出力に表示されることは必ずしも悪いことではありません。これは単に、クエリエンジンが結果セットを返す前に部分的な結果セットをキャッシュする必要があることを意味します。 temporary 物事は実際のテーブルではなく、RAM構造です。それがRAMを圧倒するほど大きい場合、MySQLはそれをディスクにこぼします。しかし、あなたはそうではありません。

    そうは言っても、クエリをリファクタリングしましょう。 idCartDATAが最大の行を取得したいと思います 各CartSplitData.SUPPLIERIDの値 。

    それでは、それをサブクエリとして記述しましょう。

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

    このクエリは、CartSplitDataに複合インデックスを配置することで劇的に高速化できます:(SUPPLIERID, IDCartDATA)

    次に、メインクエリを書き直して、そのサブクエリのIDに一致する行を見つけましょう。

    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'
    

    CartData.CartOrderrefのインデックス 作成された複合インデックスと同様に、この外部クエリに役立ちます^^^。




    1. MySQLのネストされたCASEステートメント

    2. SQL ServerのWHERE句のアンパサンド(&)演算子

    3. SpringBootテスト用のEmbeddedPostgres

    4. MySQLデータベースのパフォーマンスを提供するためのヒント-パート2-