Hegemann: Grösse einer Abfrage

Hallo,

weiss jemand ob es eine Grössenbegrenzung bei MySQL Abfragen gibt, d.h. gibt es irgendwie Probleme wenn man ein ziemlich grosses SQL Statement z.b. per PHP absetzt.

z.b. SELECT * FROM user WHERE id in (1,2,3,4,5,6,..........10000001,10000002 etc.)

Viele Grüße

Hegemann

  1. yo,

    z.b. SELECT * FROM user WHERE id in (1,2,3,4,5,6,..........10000001,10000002 etc.)

    bis her habe ich noch keine probleme bezüglich der größe bekommen, aber wenn du das genau wissen willst, schau mal ins handbuch.

    einen tiüpp noch, solche bedingungen wie 1,2....6 kann man einfacher mit dem BETWEEN Operator zusammen fassen. das macht dann auch eventuell die query kleiner.

    Ilja

  2. Hallo

    weiss jemand ob es eine Grössenbegrenzung bei MySQL Abfragen gibt,

    kein prinzipielles, dafür sind Datenbanken da.

    d.h. gibt es irgendwie Probleme wenn man ein ziemlich grosses SQL Statement | z.b. SELECT * FROM user WHERE id in (1,2,3,4,5,6,..........10000001,10000002 etc.)

    Es müssen natürlich _alle_ Daten des Resultats an den Aufrufer übermittelt werden, deswegen ist es sinnvoll, nur _die_ Daten abzufragen, die man wirklich benötigt. Das ist einer der Gründe, warum es meist sinnvoll ist, auf SELECT * zu verzichten und statt dessen mit SELECT spaltenliste FROM zu arbeiten.

    Ganz besonders gilt dies in dem Fall, dass der Aufrufer

    z.b. per PHP absetzt.

    Begrenzungen für Speicherverbrauch aufweist. Ein weiteres PHP-Problem könnte die Skriptlaufzeit ausmachen. Auch dies ist _kein_ Problem des Datenbankmanagementsystems (DBMS). Diese sind dafür ausgelegt, mit großen Datenmengen umzugehen. Ob Dein Statement in dieser Form sinnvoll ist oder durch ein günstigeres ersetzt werden sollte, das kannst nur Du selbst wissen.

    Von der Beispielzeile ausgehend würde sich eine Umformulierung zu

    SELECT  
      benötigte,  
      spalten  
    FROM user  
    WHERE id BETWEEN 1 AND obere_grenze
    

    anbieten. Dieses Statement ist kürzer, somit schneller an die DB durchgereicht und das Statement dürfte sich von der DB schneller auswerten lassen. Mehr dazu könnte Dir EXPLAIN (siehe MySQL-Handbuch) sagen.

    Wenn Du Lücken berücksichtigen musst, dann funktioniert das von mir angegebene Statement natürlich nicht wie gewünscht, das geht allerdings aus Deinem Beispiel auch nicht hervor. In vielen Fällen hilft es, wenn die Abarbeitung Deines Auswahlkriteriums von einem Index beschleunigt werden kann.

    Freundliche Grüße

    Vinzenz

    1. Hallo,

      danke für die Antworten.

      Mit der Auflistung wollte ich nur demnonstrieren, dass es sich um ein ziemlich langes SQL Statement handelt. Mit Between wäre das natürlich besser gelöst, es handelt sich aber nicht um eine Zahlenreihe.

      Mittlerweile habe ich noch einen Kollegen gefragt. Es gibt anscheinend doch eine Begrenzung des SQL Strings von höchstens 2 MB. Bei grösseren Statement gibt es anscheinend Probleme.

      Kann das jemand bestätigen, da dass von uns nicht getestet wurde.

      Viele Grüße

      Hegemann

      1. Hallo

        Mit der Auflistung wollte ich nur demnonstrieren, dass es sich um ein ziemlich langes SQL Statement handelt. Mit Between wäre das natürlich besser gelöst, es handelt sich aber nicht um eine Zahlenreihe.

        Mittlerweile habe ich noch einen Kollegen gefragt. Es gibt anscheinend doch eine Begrenzung des SQL Strings von höchstens 2 MB. Bei grösseren Statement gibt es anscheinend Probleme.

        Ist das Dein Ernst?
        Dein voller Ernst?

        Wenn ja - und ich befürchte dies - überdenke Deine Vorgehensweise. Dieser mein Vorschlag ist ernst gemeint.

        Wie ermittelst Du Deine Zahlenreihe?

        Freundliche Grüße

        Vinzenz

        1. Hallo,

          Wenn ja - und ich befürchte dies - überdenke Deine Vorgehensweise. Dieser mein Vorschlag ist ernst gemeint.
          Wie ermittelst Du Deine Zahlenreihe?

          Genau, insbesondere auf der Schiene würde ich mal weiterdenken: Schaffst du es, Ermittlung der Suchdaten und der gesuchten Daten in einer SQL-Abfrage durchzuführen, sei es Join, Subselect oder sonstwas? Ich kenn solch lange Suchstrings eigentlich nur von "Mach Abfrage 1, lies Ergebnisse, kombiniere auf String, mach Abfrage 2", aber das sollte man nach Möglichkeit vermeiden.

          MfG
          Rouven

          --
          -------------------
          ie:| fl:| br:> va:| ls:& fo:) rl:( n4:{ ss:) de:] js:| ch:? mo:} zu:|
        2. Moin!

          Richtig lesen hilft manchmal, in die richtige Richtung zu argumentieren:

          es handelt sich aber nicht um eine Zahlenreihe.

          Wie ermittelst Du Deine Zahlenreihe?

          - Sven Rautenberg

          --
          My sssignature, my preciousssss!
      2. Hallo Freunde des gehobenen Forumsgenusses,

        Mittlerweile habe ich noch einen Kollegen gefragt. Es gibt anscheinend doch eine Begrenzung des SQL Strings von höchstens 2 MB. Bei grösseren Statement gibt es anscheinend Probleme.

        Es gibt keine Probleme, es gibt halt einen Abbruch seitens des DBMS, die maximale Größe kann man aber einstellen (max_packet_size oder so in MySQL).

        Gruß
        Alexander Brock

  3. Moin!

    weiss jemand ob es eine Grössenbegrenzung bei MySQL Abfragen gibt, d.h. gibt es irgendwie Probleme wenn man ein ziemlich grosses SQL Statement z.b. per PHP absetzt.

    Die Doku sagt: Absolute Obergrenze ist 1GB, Default-Obergrenze ist 1MB.
    http://dev.mysql.com/doc/refman/5.1/en/packet-too-large.html

    - Sven Rautenberg

    --
    My sssignature, my preciousssss!
    1. yo,

      Die Doku sagt: Absolute Obergrenze ist 1GB, Default-Obergrenze ist 1MB.

      ich würde gerne mal ein SQL statement von 1 GB größe sehen...

      Ilja

      1. Moin!

        Die Doku sagt: Absolute Obergrenze ist 1GB, Default-Obergrenze ist 1MB.

        ich würde gerne mal ein SQL statement von 1 GB größe sehen...

        Wenn du ein BLOB füllst, dürfte das recht simpel erreichbar sein.

        - Sven Rautenberg

        --
        My sssignature, my preciousssss!
        1. yo,

          ich würde gerne mal ein SQL statement von 1 GB größe sehen...

          Wenn du ein BLOB füllst, dürfte das recht simpel erreichbar sein.

          ich meinte das eher bezogen auf die größe einer abfrage, bin da vom titel des posts ausgegangen.

          Ilja

          1. Moin!

            ich würde gerne mal ein SQL statement von 1 GB größe sehen...

            Wenn du ein BLOB füllst, dürfte das recht simpel erreichbar sein.

            ich meinte das eher bezogen auf die größe einer abfrage, bin da vom titel des posts ausgegangen.

            Auch INSERT oder UPDATE ist eine SQL-Abfrage. :)

            - Sven Rautenberg

            --
            My sssignature, my preciousssss!
            1. yo,

              Auch INSERT oder UPDATE ist eine SQL-Abfrage. :)

              naja, darüber kann man sich streiten. was den INSERT/UPDATE betrifft, so können da blogs sicherlich ganz schön ins gewicht fallen und deswegen wohl auch diese enorme größe. aber bezogen auf  abfragen im sinne von abfragen wäre das doch schon ganz schön groß. und alleine die vorstellung, solche ein query entwickeln zu müssen, läßt meinen magen umdrehen.....

              Ilja

      2. Hallo.

        ich würde gerne mal ein SQL statement von 1 GB größe sehen...

        Wenn ich etwas ganz bestimmt nicht sehen will, dann sicher das.
        MfG, at