0

Mysql ステートメントに実際の問題があります。いくつかのテーブルを結合し、クエリを実行して、別のテーブルの値の平均で並べ替える必要があります。これは私が持っているものです...

    SELECT
    ROUND(avg(re.rating), 1)AS avg_rating,
         s.staff_id, s.full_name, s.mobile, s.telephone, s.email, s.drive
    FROM staff s

    INNER JOIN staff_homes sh 
     ON s.staff_id=sh.staff_id
    INNER JOIN staff_positions sp 
     ON s.staff_id=sp.staff_id
    INNER JOIN reliability re 
     ON s.staff_id=re.staff_id
    INNER JOIN availability ua 
     ON s.staff_id=ua.staff_id 

    GROUP BY staff_id
    ORDER BY avg_rating DESC

「SELECTはMAX_JOIN_SIZE行を超える行を調べます。WHEREを確認し、SELECTが問題ない場合はSET SQL_BIG_SELECTS = 1またはSET SQL_MAX_JOIN_SIZE = #を使用してください」というエラーが表示されますが、これでうまくいくと思います。

これは、結合が多すぎることを意味すると思います。共有ホスティングであるため、大きなクエリを実行できないため、わかりません。

私が知りたいのは、エラーが正確に何を意味するか (Google で検索しましたが、答えがわかりません)、クエリをより効率的にすることでどのように回避できるかです。

どんな助けでも大歓迎です。ありがとう

編集:

結合が必要な理由は、検索機能に基づいてテーブルをクエリできるようにするためです...

     SELECT
 ROUND(avg(re.rating), 1)AS avg_rating

 ,  s.staff_id, s.full_name, s.mobile, s.telephone, s.email, s.drive
FROM staff s

 INNER JOIN staff_homes sh 
 ON s.staff_id=sh.staff_id
 INNER JOIN staff_positions sp 
 ON s.staff_id=sp.staff_id
 INNER JOIN reliability re 
 ON s.staff_id=re.staff_id
 INNER JOIN availability ua 
 ON s.staff_id=ua.staff_id

WHERE s.full_name LIKE '%'
AND s.drive = '1'
AND sh.home_id = '3'
AND sh.can_work = '1'
AND sp.position_id = '3'
AND sp.can_work = '1'


GROUP BY staff_id
ORDER BY avg_rating DESC

編集2

これが私の説明の結果でした。また、MYSQL が苦手なのですが、どうすれば外部キーを設定できますか?

id select_type テーブル タイプ possible_keys キー key_len ref 行 エクストラ

1 SIMPLE ua ALL NULL NULL NULL NULL 14 一時的な使用。ファイルソートの使用

1 SIMPLE re ALL NULL NULL NULL NULL 50 where; の使用 結合バッファの使用

1 SIMPLE sp ALL NULL NULL NULL NULL 84 where の使用。結合バッファの使用

1 SIMPLE sh ALL NULL NULL NULL NULL 126 where の使用。結合バッファの使用

1 SIMPLE s eq_ref PRIMARY PRIMARY 4 web106-prestwick.ua.staff_id 1

編集 3: おかげで、それは私の外部キーでした。正しく設定されていませんでした。問題が分類されました

4

2 に答える 2

1

おそらく、テーブルでより多くの、および/またはより良いインデックスを使用する必要があります。

于 2012-07-02T16:09:28.163 に答える
0

使用しているデータベースによると、サブクエリを使用すると最適化が高速になるかどうかが異なります。

クエリに 2 つのボトルネックがある可能性があります。

  • クエリの平均関数を削除してみてください。クエリが高速化する場合は、サブクエリに置き換えてみて、何が起こるかを確認してください。

  • 複数の結合によりパフォーマンスが低下することが多く、db スキーマを変更する以外にできることはありません。最も簡単な解決策は、データを事前計算し、db エンジンの作業を軽減するテーブルを用意することです。このテーブルは、暗黙のテーブルのデータを変更したときにトリガーされるストアド プロシージャで満たすことができます。また、php アプリケーションからテーブルの値を変更することもできます。

于 2012-07-02T15:28:58.443 に答える