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

ORDERBYクエリで制限値に応じて異なるインデックスを使用するMySQL

    それが物事の進め方です。ちょっと待ってください...

    オプティマイザーは、INDEX(この場合はACTI_DATE_I)を使用したいと考えています。しかし、それが遅くなる場合は使用したくありません。

    プランA:インデックスを使用します。

    1. 最後にBTree構造化インデックスに到達します(DESCのため)
    2. 逆方向にスキャン
    3. インデックスの各行について、データの対応する行を検索します。注:PRIMARY KEYは任意の2次キーに暗黙的に追加されるため、索引には(ACTIVITY_DATE、ACTIVITY_ID)があります。 PK(ACTIVITY_ID)を使用して「データ」に到達することは、別のBTreeルックアップであり、潜在的にランダムです。したがって、それは潜在的に遅いです。 (ただし、あなたの場合はそれほど遅くはありません。)
    4. これはLIMIT行の後で停止します。

    プランB:テーブルを無視する

    1. テーブルをスキャンして、tmpテーブルを作成します。 (メモリ内にある可能性があります。)
    2. tmpテーブルを並べ替えます
    3. LIMIT行をはがします。

    あなたの場合(96-10Kの1%)、テーブルスキャンを選択したのは驚くべきことです。通常、カットオフはテーブルの行数の約10%〜30%です。

    ANALYZE TABLE すべき 統計の再計算が発生しましたが、可能性があります 他のプランに合わせるように説得しました。

    どのバージョンのMySQLを使用していますか? (いいえ、この領域での変更はわかりません。)

    試すことができることの1つ:OPTIMIZE TABLE ACTIVITIES; これによりテーブルが再構築され、ブロックが再パックされ、潜在的に さまざまな統計。それが役に立ったら、私はそれを知りたいです-私は通常「テーブルの最適化は役に立たない」と言っているので。




    1. Oracleを使用してDjangoで自動テストを作成する際のORA-65096エラーの修正

    2. JavaのpreparedStatementを使用してJSONオブジェクトをPostgresに挿入するにはどうすればよいですか?

    3. MySQL、1つのクエリで複数のテーブルを更新

    4. PDOプリペアドステートメントを使用して複数の行を挿入します