web-dev-qa-db-ja.com

MySQL-SQL_BIG_SELECTS

ちょっと、私はSQL_BIG_SELECTSを調査してきましたが、これまでのところ、MySQLのドキュメントはあまり役に立ちませんでした。以下のようなエラーが表示されないようにするための洞察を探しています。

エラー1104:SELECTで調べられるレコードが多すぎるため、おそらく非常に長い時間がかかります。 SELECTに問題がない場合は、WHEREを確認し、SET OPTION SQL_BIG_SELECTS = 1を使用してください。

  1. MySQLはクエリが「BIG SELECT」であるとMySQLが何行判断しますか?
  2. 適切なインデックス作成は通常、この問題を解決しますか?
  3. SQL_BIG_SELECTSは「最後の手段」と考えられていますか、それとも良い習慣ですか?
  4. (クエリを実行せずに)構成で「SQL_BIG_SELECTS = 1」を設定するにはどうすればよいですか?
  5. 知っておく価値のある他の選択肢はありますか?

前もって感謝します!

26
Matt
  1. MySQLは、 'max_join_size'の値に基づいて、クエリが '大きな選択'かどうかを判断します。クエリがこの行数よりも多くを調べる必要がある場合、クエリは「大きな選択」と見なされます。最大結合サイズの値を表示するには、「変数の表示」を使用します。

  2. 索引付け、特にwhere句を使用すると、この問題の発生を防ぐことができると思います。

  3. SQL_BIG_SELECTSは、ユーザーが過度に大きなクエリを誤って実行するのを防ぐために使用されます。 mysql.cnfでONに設定するか、起動時にコマンドラインオプションを使用してもかまいません。

  4. SQL_BIG_SELECTSは、my.cnfまたはサーバーの起動時に設定できます。 SET SESSION SQL_BIG_SELECTS=1を使用して、セッションごとに設定することもできます。

  5. 考えられることではありません。クエリをチェックして、本当に使用する必要があることを確認します。サーバーではデフォルトで有効になっており、max_join_sizeは非常に大きいです。

39
jonstjohn

あなたはできません設定 SQL_BIG_SELECTS my.cnfまたはサーバーの起動時。これはセッションのみのパラメーターであるためです。 MySQL 5.0.60を使用しています。

2
Bing Liu

誰かが以前に投稿したことがあるように、サーバーの起動時にmy.cnfにSQL_BIG_SELECTSを設定することはできません。この種類の変数はそれをサポートしていません。

この厄介なエラーを示すSymfonyアプリケーションで同じ問題が発生しました:

The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is okay

しかし、varialbeの数を増やすことができます

sql_big_selectsに関連するmax_join_size

権限のあるmysqlユーザーとしてコマンドを実行することで修正できました。

# SET GLOBAL max_join_size=18446744073709551615;

または、max_join_sizeが構成ファイルで設定できるため、my.cnfに含めることができます

まあ、これが他の誰かを助けることを願っています。

1
Rubendob

私はデータベースに2000kを超えるレコードがあり、私のクエリは、特定のフィールドの重複の削除と更新の徹底的な比較を伴う大規模な選択でした...mysql(回答日の現在のバージョン) index句に含まれる2つのフィールドでwhereを使用することになりました...これは他の人にも役立つはずです...

  1. フィールドにインデックスを設定
  2. 分析テーブル
  3. クエリを実行する

HTH

1
Zaffar Saffee

次のコマンドは私のために働きます

SET GLOBAL max_join_size=18446744073709551615;

しかし、コマンドの代わりにmy.cnfファイルに何を入れる必要がありますか?ところで、「5.6.12 MySQL Community Server」を使っています

0
Musa