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

このMySQLクエリを最適化する方法は?何百万もの行

    次のインデックス(bツリーインデックス)を作成します:

    analytics(user_id, source, id) 
    transactions(analytics, status)
    

    これはゴードンの提案とは異なります。

    インデックス内の列の順序は重要です。

    特定のanalytics.user_idでフィルタリングします 、したがって、このフィールドはインデックスの最初である必要があります。次に、analytics.sourceでグループ化します。 。 sourceによる並べ替えを避けるため これは、インデックスの次のフィールドになります。 analytics.idも参照します 、したがって、このフィールドをインデックスの一部として、最後に配置することをお勧めします。 MySQLはインデックスだけを読み取ることができ、テーブルに触れることはできませんか?わかりませんが、テストはかなり簡単です。

    transactionsのインデックス analyticsから始める必要があります 、JOINで使用されるため 。 statusも必要です 。

    SELECT 
        analytics.source AS referrer, 
        COUNT(analytics.id) AS frequency, 
        SUM(IF(transactions.status = 'COMPLETED', 1, 0)) AS sales
    FROM analytics
    LEFT JOIN transactions ON analytics.id = transactions.analytics
    WHERE analytics.user_id = 52094 
    GROUP BY analytics.source 
    ORDER BY frequency DESC 
    LIMIT 10 
    


    1. ORACLE-ORA-01843:有効な月ではありません

    2. JetShowPlan:入門書

    3. SQLまたはPL/SQLを使用して最初の重複行のみを更新するOracleのUPDATEステートメント

    4. mysqlの2人のユーザーの通信間の最新のメッセージを選択します