それが物事の進め方です。ちょっと待ってください...
オプティマイザーは、INDEX(この場合はACTI_DATE_I)を使用したいと考えています。しかし、それが遅くなる場合は使用したくありません。
プランA:インデックスを使用します。
- 最後にBTree構造化インデックスに到達します(DESCのため)
- 逆方向にスキャン
- インデックスの各行について、データの対応する行を検索します。注:PRIMARY KEYは任意の2次キーに暗黙的に追加されるため、索引には(ACTIVITY_DATE、ACTIVITY_ID)があります。 PK(ACTIVITY_ID)を使用して「データ」に到達することは、別のBTreeルックアップであり、潜在的にランダムです。したがって、それは潜在的に遅いです。 (ただし、あなたの場合はそれほど遅くはありません。)
- これはLIMIT行の後で停止します。
プランB:テーブルを無視する
- テーブルをスキャンして、tmpテーブルを作成します。 (メモリ内にある可能性があります。)
- tmpテーブルを並べ替えます
- LIMIT行をはがします。
あなたの場合(96-10Kの1%)、テーブルスキャンを選択したのは驚くべきことです。通常、カットオフはテーブルの行数の約10%〜30%です。
ANALYZE TABLE
すべき 統計の再計算が発生しましたが、可能性があります 他のプランに合わせるように説得しました。
どのバージョンのMySQLを使用していますか? (いいえ、この領域での変更はわかりません。)
試すことができることの1つ:OPTIMIZE TABLE ACTIVITIES;
これによりテーブルが再構築され、ブロックが再パックされ、潜在的に さまざまな統計。それが役に立ったら、私はそれを知りたいです-私は通常「テーブルの最適化は役に立たない」と言っているので。