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

filesortを使用するとMYSQLのパフォーマンスが低下する

    問題は、MySQLがクエリの実行時に1つのインデックスのみを使用することです。 WHEREの3つのフィールドを使用する新しいインデックスを追加する場合 句を指定すると、行がより速く見つかります。

    ALTER TABLE `adverts` ADD INDEX price_status_approved(`price`, `status`, `approved`);
    

    MySQLのドキュメントによると、ORDERBY最適化> :

    これはあなたの場合に起こることです。EXPLAINの出力として オプティマイザーはキーpriceを使用します 行を検索します。ただし、ORDER BY date_updatedフィールドにあります キーpriceに属していない 。

    行をすばやく見つけて並べ替えるには、WHEREで使用されるすべてのフィールドを含むインデックスを追加する必要があります。 およびORDER BY 条項:

    ALTER TABLE `adverts` ADD INDEX status_approved_date_updated(`status`, `approved`, `date_updated`);
    

    並べ替えに使用するフィールドは、インデックスの最後の位置にある必要があります。 priceを含めるのは無意味です クエリで使用される条件は値の範囲を返すため、インデックス内にあります。

    EXPLAINの場合 それでもfilesortを使用していることが示されている場合は、選択したインデックスをMySQLに使用させることができます。

    SELECT adverts.*
    FROM adverts
    FORCE INDEX(status_approved_date_updated)
    WHERE price >= 0
    AND adverts.status = 1
    AND adverts.approved = 1
    ORDER BY date_updated DESC 
    LIMIT 19990, 10
    

    MySQLオプティマイザはほとんどの場合正しい選択を行うため、通常はインデックスを強制する必要はありません。しかし、時にはそれは悪い選択をするか、最良の選択ではありません。パフォーマンスが向上するかどうかを確認するには、いくつかのテストを実行する必要があります。



    1. SSMSから完全な結果セットを取得する方法

    2. データソースでのMySQL接続妥当性テスト:SELECT 1またはそれ以上?

    3. 既存のテーブルの列に一意の制約を作成する方法-SQLServer/TSQLチュートリアルパート97

    4. OracleマージをPostgreSQLへのクエリに変換する必要があります