Lukas.: Frage zu mysql #1104

Hallo,

es geht um diese mysql Fehlermeldung:

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

Kann es sein, dass mysql die Grenze, ab der es diese Fehlermeldung ausspuckt, gar nicht anhand der tatsächlich vorhandenen Daten anlegt, sondern das vollkommen theoretsich anhand der Tabellenzeilen, Tabellenspalten und JOINS errechnet?

Ich frage deshalb, weil mir der Fehler heute in all meinen Systemen erschien, obwohl diese völlig unterschiedlich hohe tatsächliche Datenmengen beinhalten (bei absolut gleichem Tabellenschema).

L.

  1. Moin,

    Mal ein Link als Antwort: http://stackoverflow.com/questions/950465/mysql-sql-big-selects

    Gruß Bobby

    --
    -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <- ### Henry L. Mencken ### -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <- ### Viktor Frankl ### ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
    1. Moin,

      Mal ein Link als Antwort: http://stackoverflow.com/questions/950465/mysql-sql-big-selects

      Moin,

      den Link kenne ich bereits, er beantwortet aber meine Frage nicht 😉

      L.

      1. Moin,

        Was verstehst du an [...] based on the value of 'max_join_size' [...] nicht? Es ist genau die Antwort auf deine Frage.

        Gruß Bobby

        --
        -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <- ### Henry L. Mencken ### -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <- ### Viktor Frankl ### ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
        1. Moin,

          Was verstehst du an [...] based on the value of 'max_join_size' [...] nicht? Es ist genau die Antwort auf deine Frage.

          Moin,

          kannst Du mir den Ausdruck erklären? Für mich steht imer noch nicht fest, ob hierzu die tatsächlichen Einträge heran gezogen werden oder nicht.

          L.

          1. Moin,

            In der Doku steht:

            [...] Do not permit statements that probably need to examine more than max_join_size rows (for single-table statements) or row combinations (for multiple-table statements) or that are likely to do more than max_join_size disk seeks. By setting this value, you can catch statements where keys are not used properly and that would probably take a long time. Set it if your users tend to perform joins that lack a WHERE clause, that take a long time, or that return millions of rows. [...]

            https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_max_join_size

            Gruß Bobby

            --
            -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <- ### Henry L. Mencken ### -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <- ### Viktor Frankl ### ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
            1. max_join_size gibt an, wieviele Zeilen ein JOIN produziert. Wenn Du 3 Tabellen joinst, und jede 1000 Rows hat, gibt das im ungünstigsten Fall eine max_join_size von einer Milliarde Rows. Welcher Wert in deine(m|n) Server(n?) eingestellt ist, kannst Du in phpMyAdmin finden, wenn Du auf die Server-Übersicht gehst und da den Reiter "Variablen" auswählst. Wenn da 1000 steht, ist es klar zu wenig, wenn da in etwa $$18\cdot10^{18}$$ steht, ist es klar zu viel (das wäre uint64.maxvalue).

              Du solltest Dir deine Query anschauen und versuchen abzuschätzen, wie viele Rows auf Grund der Join-Bedingungen entstehen. Das kann Dir hier keiner abnehmen, weil wir dein Datenmodell und deine Inhalte nicht kennen.

              Wenn MySQL dich auf diese Weise warnt, hat entweder jemand die MySQL Konfiguration geändert und die max_join_size reduziert, oder es wurde ein Index gedroppt, so dass statt eines Index-Seek oder Index-Scan nun ein Table-Scan durchgeführt werden muss. Vielleicht hast Du auch eine vermeintliche Kleinigkeit am Statement geändert, so dass nun kein Index-Scan mehr möglich ist.

              Also: meditiere über dein Statement - kannst es uns auch gern zeigen - und lass Dir vom SQL Server den Zugriffspfad erklären (EXPLAIN).

              Rolf

              Rolf

              1. Hi Rolf,

                danke für Deine Antwort.

                max_join_size gibt an, wieviele Zeilen ein JOIN produziert. Wenn Du 3 Tabellen joinst, und jede 1000 Rows hat, gibt das im ungünstigsten Fall eine max_join_size von einer Milliarde Rows. Welcher Wert in deine(m|n) Server(n?) eingestellt ist, kannst Du in phpMyAdmin finden, wenn Du auf die Server-Übersicht gehst und da den Reiter "Variablen" auswählst. Wenn da 1000 steht, ist es klar zu wenig, wenn da in etwa $$18\cdot10^{18}$$ steht, ist es klar zu viel (das wäre uint64.maxvalue).

                Habe ich gestern schon nachgesehen und es ist auf ca. 200 Mio eingestellt, was ich auch schon sehr wenig finde, wenn man den mysql Defaultwert mal betrachtet.

                Du solltest Dir deine Query anschauen und versuchen abzuschätzen, wie viele Rows auf Grund der Join-Bedingungen entstehen. Das kann Dir hier keiner abnehmen, weil wir dein Datenmodell und deine Inhalte nicht kennen.

                Habe mir die Query gestern schon mit meinem Hoster gemeinsam angesehen, da gibts wenig dran zu rütteln.

                Wenn MySQL dich auf diese Weise warnt, hat entweder jemand die MySQL Konfiguration geändert und die max_join_size reduziert, oder es wurde ein Index gedroppt, so dass statt eines Index-Seek oder Index-Scan nun ein Table-Scan durchgeführt werden muss. Vielleicht hast Du auch eine vermeintliche Kleinigkeit am Statement geändert, so dass nun kein Index-Scan mehr möglich ist.

                Wie gesagt, die Konfiguration ist geändert, ich bin dem Problem jetzt über ein SET SQL_BIG_SELECTS=1 begegnet.

                Was mich nur grundsätzlich wundert, ist, dass mysql die Warnung (bzw. den fehler) meldet, nahezu egal wieviele Rows in den betroffenen Tabellen stehen.

                Also: meditiere über dein Statement - kannst es uns auch gern zeigen - und lass Dir vom SQL Server den Zugriffspfad erklären (EXPLAIN).

                Gemacht…

                L.

                1. Solange die Laufzeit der Query im akzeptablen Rahmen bleibt, ist das ja ok. Möglicherweise ist der Server auch einfach zu sensibel mit der Warnung.

                  Rolf

      2. den Link kenne ich bereits, er beantwortet aber meine Frage nicht 😉

        Wie arbeitest Du denn??? Nimmt die dort gegebene Diskussion und prüfe Schritt für Schritt, ob es auf dein spezielles Problem zutrifft. Und das musst Du schon selber machen. MfG

        1. Wie arbeitest Du denn???

          Pflaum' mich nicht an, ich bhabe Dir nichts getan!