1

私は次のクエリを持っています

SELECT STRAIGHT_JOIN a.*
  FROM b
  INNER JOIN a ON a.b_id = b.b_id
  INNER JOIN c ON dd.a_id = a.id
  WHERE a.a_type_id = 164
    AND a.status = 1
    AND NOT EXISTS (
      SELECT a2.*
      FROM a a2
      INNER JOIN c c2 ON c2.a_id = a2.id
      INNER JOIN d d.a_id = a2.id
      WHERE a.w_id = 567
        AND c.ds_id = c2.ds_id
    )
  order by b.id
  LIMIT 1;

説明すると、次の結果が得られます

*************************** 1. row ***************************
             id: 1
    select_type: PRIMARY
          table: b
           type: index
  possible_keys: index_b_on_b_id
            key: PRIMARY
        key_len: 4
            ref: NULL
           rows: 1
          Extra: 
  *************************** 2. row ***************************
             id: 1
    select_type: PRIMARY
          table: a
           type: ref
  possible_keys: PRIMARY,index_a_on_a_type_id,index_a_on_status,index_a_on_b_id,index_a_on_a_type_id_and_status
            key: index_a_on_b_id
        key_len: 4
            ref: b.b_id
           rows: 1
          Extra: Using where
  *************************** 3. row ***************************
             id: 1
    select_type: PRIMARY
          table: c
           type: ref
  possible_keys: index_c_on_a_id
            key: index_c_on_a_id
        key_len: 4
            ref: a.id
           rows: 1
          Extra: Using where
  *************************** 4. row ***************************
             id: 2
    select_type: DEPENDENT SUBQUERY
          table: c2
           type: ref
  possible_keys: index_c_on_ds_id,index_c_on_a_id
            key: index_c_on_ds_id
        key_len: 4
            ref: c.ds_id
           rows: 1
          Extra: 
  *************************** 5. row ***************************
             id: 2
    select_type: DEPENDENT SUBQUERY
          table: d
           type: ref
  possible_keys: index_d_on_a_id,index_d_on_w_id
            key: index_d_on_a_id
        key_len: 5
            ref: c2.a_id
           rows: 1
          Extra: Using where
  *************************** 6. row ***************************
             id: 2
    select_type: DEPENDENT SUBQUERY
          table: a2
           type: eq_ref
  possible_keys: PRIMARY
            key: PRIMARY
        key_len: 4
            ref: d.a_id
           rows: 1
          Extra: Using where; Using index

Explain 結果から、スキャンされる行は 1 行だけですが、実際の実行時間は 1 秒以上かかります。説明は単なる見積もりであり、実際の実行は異なる場合がありますが、ここで最適化できるものはありますか (新しいインデックスの追加、クエリの書き換えなど)。

表の行数は次のとおりです。

  • => 2585530

  • b => 10000

  • c => 2585525

  • d => 3350381

4

1 に答える 1

0

すべての情報 (スキーマ、データ、および最終目標) を知らずにこのような質問に答えることは非常に困難ですが、一般的な方法でいくつかの情報を提供しようとします。

クエリで 20,373 行を評価していて、そのうちの 1 つだけを返しています。表面的には、これは多くの破棄されたデータのように見えるので、調べる価値があるかもしれません。クエリを読んで、何をしようとしているのかを正確に特定することはほとんど不可能です (既に述べた他のすべての情報がなければ)。

クエリの「NOT EXISTS ( … )」要素をリファクタリングして取り除き、代わりに適切なインデックスを持つ条件ステートメントを使用して最初に有効なデータを選択し、残りのデータをこの最初のクエリに結合することをお勧めします。

これはあなたのデータ構造では完全に可能ではないかもしれませんが、提供されているものから、私が本当にお勧めできるのはそれだけです. これが適切でない場合は、詳細情報または完全なスキーマ、サンプル データ、最終的なクエリの出力を含む構造の例を使用して回答を編集できます。

于 2013-03-06T08:45:11.470 に答える