Pit: #1104 - The SELECT would examine more than MAX_JOIN_SIZE rows

Hallo,

ich habe ein seltsames Phänomen:

Der Fehler #1104 - The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET MAX_JOIN_SIZE=# if the SELECT is okay taucht bei identischer Query in php7 auf, in php 5.6 aber nicht.

  1. Wie kann ich mir das erklären?

  2. Wie/wo setze ich denn sql big selects auf 1? Mache ich das als Query im Programm?

Pit

  1. Tach!

    Der Fehler #1104 - The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET MAX_JOIN_SIZE=# if the SELECT is okay taucht bei identischer Query in php7 auf, in php 5.6 aber nicht.

    1. Wie kann ich mir das erklären?

    Weiß die allwissende Müllhalde nichts darüber? Ich müsste auch erst recherchieren, warum das von der PHP-Version abhängig sein soll. Vielleicht liegt es an der jeweils verwendeten MySQL-API. Deren Versionsnummer erzählt dir ein phpinfo().

    1. Wie/wo setze ich denn sql big selects auf 1? Mache ich das als Query im Programm?

    Ich würde lieber schauen, ob nicht die Query so optimiert werden kann, dass nicht erst so ein großes Zwischenprodukt entsteht. Die typischen Datenmengen auf PHP-Seiten übersteigen normalerweise nicht solche Limits, also müssen sie auch nicht temporär anfallen.

    dedlfix.

    1. Hallo dedlfix,

      Weiß die allwissende Müllhalde nichts darüber?

      Ich kann das schon verstehen, dass Du/ihr Euch manchmal so fühlt, aber so ist es (zumindest von mir) gar nicht gemeint. Es ist manchmal schwierig zu beurteilen, ob das für Euereins nur ein "altbekannter Klacks" ist oder eine schwierige Aufgabe, die viel mehr Informationen benötigt und selbst dann noch viel Arbeit bedeuten würde. Deshalb fragt man (also ich) auch schon mal offen in den Raum hinein, mag wirklich möglich sein, dass das dann bei Dir/Euch so ankommt, wie Dein obiger Satz vermuten läßt.

      Ich würde lieber schauen, ob nicht die Query so optimiert werden kann, dass nicht erst so ein großes Zwischenprodukt entsteht. Die typischen Datenmengen auf PHP-Seiten übersteigen normalerweise nicht solche Limits, also müssen sie auch nicht temporär anfallen.

      Danke für den Hinweis. Das Setzen einiger Indizes hat für Abhilfe gesorgt.

      Pit

      1. Hallo Pit,

        das finde ich jetzt merkwürdig. Die Anzahl Zeilen, die in der FROM Klausel durch die Joins entstehen, sollte nicht von einen Index abhängen. Das wäre ein verändertes Query-Ergebnis.

        Möglicherweise hat er vorher Table Scans gemacht und alle Zeilen der Tabelle gezählt auch wenn ein Where sie gefiltert hat. Um dem näher zu kommen hättest du vor der Indexanlage einen Explain machen müssen.

        Den solltest du aber unbedingt noch machen und gucken, welcher Index von den Neuen zum Zug kommt. Überflüssige Indexe behindern Inserts und Updates.

        Rolf

        --
        sumpsi - posui - clusi
        1. Hallo Rolf,

          Überflüssige Indexe behindern Inserts und Updates.

          Und DELETEs 😉

          Sie können alles drei aber auch beschleunigen. Je nach Situation und Constraint halt 😜

          LG,
          CK

      2. Hallo Pit,

        Weiß die allwissende Müllhalde nichts darüber?

        Ich kann das schon verstehen, dass Du/ihr Euch manchmal so fühlt, aber so ist es (zumindest von mir) gar nicht gemeint. Es ist manchmal schwierig zu beurteilen, ob das für Euereins nur ein "altbekannter Klacks" ist oder eine schwierige Aufgabe, die viel mehr Informationen benötigt und selbst dann noch viel Arbeit bedeuten würde. Deshalb fragt man (also ich) auch schon mal offen in den Raum hinein, mag wirklich möglich sein, dass das dann bei Dir/Euch so ankommt, wie Dein obiger Satz vermuten läßt.

        Ich glaube, das hast du missverstanden. Mit der „allwissenden Müllhalde“ ist normalerweise Google gemeint. Dedlfix wollte wissen, was du bei Google dazu gefunden hast.

        LG,
        CK

  2. Hallo Pit,

    hast Du beim PHP Wechsel auch von mysql nach mysqli oder PDO gewechselt? Da mag es andere Defaults geben.

    Grundsätzlich musst Du einen SET Befehl wie ein INSERT oder UPDATE ausführen (also als non-query Statement).

    Aber MAX-JOIN-SIZE ist üblicherweise ab Werk riesig genug. Was hast Du denn da zusammengedrechselt?

    Rolf

    --
    sumpsi - posui - clusi
    1. Hallo Rolf,

      hast Du beim PHP Wechsel auch von mysql nach mysqli oder PDO gewechselt? Da mag es andere Defaults geben.

      Jaja, den Wechsel nach mysqli habe ich auch gemacht.

      Grundsätzlich musst Du einen SET Befehl wie ein INSERT oder UPDATE ausführen (also als non-query Statement).

      Gut zu wissen, danke.

      Aber MAX-JOIN-SIZE ist üblicherweise ab Werk riesig genug. Was hast Du denn da zusammengedrechselt?

      Da war gar nicht mal so viel… Ich habe jetzt bei einer zu joinenden Tabelle nachträglich 4 Indizes gesetzt, jetzt läuft die Query wie "nur was". Also alles wieder ok, zumindest was diese Query angeht. Ich habe noch so einen Kandidaten... der läuft zwar jetzt, hat aber heute über Tag mal dieselbe Fehlermeldung gebracht. Dort werden aber irgendwo so um die 7-8 Tabellen gejoint. Da sie aber jetzt läuft und heute über Tag, als sie den Fehler brachte, auch ein anderer Fehler vorhanden war (der jetzt repariert ist), lass ich erstmal die finger davon.

      Pit