2009-06-04 2 views
25

Hey, ich habe SQL_BIG_SELECTS untersucht, aber die MySQL-Dokumentation war bisher ziemlich wenig hilfreich. Ich bin auf der Suche nach einem Hinweis, wie Fehler wie der folgende verhindert werden können.MySQL - SQL_BIG_SELECTS

ERROR 1104: The SELECT would examine too many records and probably take a very long time. Check your WHERE and use SET OPTION SQL_BIG_SELECTS=1 if the SELECT is ok

  1. an, wie viele Zeilen hat MySQL entscheiden, dass eine Abfrage eine "BIG SELECT" ist?
  2. Wird dieses Problem normalerweise durch richtige Indexierung behoben?
  3. Wird SQL_BIG_SELECTS als "letzter Ausweg" betrachtet, oder ist es eine gute Vorgehensweise?
  4. Wie würde jemand "SQL_BIG_SELECTS = 1" in der Konfiguration setzen (ohne die Abfrage ausführen zu müssen)?
  5. Gibt es noch weitere wissenswerte Alternativen?

Vielen Dank im Voraus!

Antwort

38
  1. MySQL bestimmt, ob eine Abfrage eine 'große Auswahl' basierend auf dem Wert von 'max_join_size' ist oder nicht. Wenn die Abfrage wahrscheinlich mehr als diese Anzahl von Zeilen untersuchen muss, wird sie als "große Auswahl" betrachtet. Verwenden Sie "show variables", um den Wert der maximalen Join-Größe anzuzeigen.

  2. Ich glaube, dass die Indexierung und insbesondere eine gute Where-Klausel dieses Problem verhindern wird.

  3. SQL_BIG_SELECTS wird verwendet, um zu verhindern, dass Benutzer versehentlich übermäßig große Abfragen ausführen. Es ist in Ordnung, es in mysql.cnf auf ON zu setzen oder die Befehlszeilenoption beim Start zu verwenden.

  4. Sie können SQL_BIG_SELECTS in my.cnf oder beim Serverstart festlegen. Es kann auch auf Sitzung mit SET SESSION SQL_BIG_SELECTS=1 festgelegt werden.

  5. Nicht dass ich mir vorstellen kann. Ich würde nur Ihre Abfrage überprüfen, um sicherzustellen, dass Sie sie wirklich verwenden müssen. Unsere Server haben es standardmäßig aktiviert, und max_join_size ist sehr groß.

+0

Große Hilfe, danke! – Matt

+2

Das Setzen von korrekten Indizes für Tabellen, die in 'join' verwendet werden, kann das Problem ebenfalls lösen - gerade so. –

+0

Danke, das hat mir nicht nur geholfen, mein Problem zu lösen, sondern auch meine komplette Datenbankstruktur zu optimieren! – Tumtum

2

Sie nicht gesetzt SQL_BIG_SELECTS in my.cnf oder beim Starten des Servers, da es eine Sitzung nur Parameter ist. Ich benutze MySQL 5.0.60.

1

Da jemand eine Nachricht vorher geschrieben hat, können Sie SQL_BIG_SELECTS nicht auf my.cnf beim Serverstart setzen. Diese Art von Variable unterstützt das nicht.

Ich hatte ein gleiches Problem mit einer Symfony Anwendung diesen lästigen Fehler zeigt:

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 

Aber die Anzahl der varialbe

max_join_size erhöhen kann, die

konnte ich SQL_BIG_SELECTS verwendet Um es zu beheben, einen Befehl als privilegierter mysql Benutzer auszuführen:

# SET GLOBAL max_join_size=18446744073709551615; 

Oder Sie können es in meine einschließen.cnf, weil max_join_size in der Konfigurationsdatei

einrichten kann Ich hoffe, dass dies jemand anderem helfen kann.

0

Nach mir Befehl funktioniert

SET GLOBAL max_join_size=18446744073709551615; 

Aber was brauche ich anstelle des Befehls in my.cnf setzen? Btw, ich benutze "5.6.12 MySQL Community Server"

0

Ich hatte mehr als 2000k Datensätze in db, und meine Abfrage war big-select mit erschöpfenden Vergleich für die Entfernung und Aktualisierung der Duplizierung bestimmter Feld ... I das gleiche von mysql (aktuelle Version auf Antwort Datum) gesagt wurde, und ich landete in where Klausel beteiligt mit index auf 2 Feldern ... diese sollten auch andere ... Schritte helfen, die für mich gearbeitet waren:

  1. Set Index auf Feld
  2. ANALYSETABELLE
  3. führen Sie die Abfrage

HTH

-1
SET SESSION SQL_BIG_SELECTS =1;# MySQL returned an empty result set (i.e. zero rows). 
SELECT a.`HACtrl` , b.`HBCtrl` , c.`HDCtrl` 
FROM `HO110BLote` AS a 
LEFT JOIN `HO113BPago` AS b ON (b.HBHACtrl = a.HACtrl) 
LEFT JOIN `HO113BRecibos` AS c ON (c.HDHBCtrl = b.HBCtrl) 
WHERE HAManzana = '03' 
AND HALote = '09' 
LIMIT 0 , 100 
+3

Bitte bearbeiten Sie Ihre Antwort und fügen Sie einige Erklärungen hinzu. Vielen Dank. – Clijsters