Horatius: SQL Abfrage viel zu langsam

Einen schönen guten Abend,

Ich habe ein mir unerklärliches Rätsel.

Es werden zwei verschiedene Abfragen auf eine sehr große Tabelle (2,9 Mio Einträge) angewendet.

== Aufbau Tabelle ==

id(Primärschlüssel) > varchar(32)
...
feld1 > double(16,4)
...
feld2 > char(1)

== Abfrage 1 ==

SELECT id FROM Tabelle WHERE (feld1 = 1) LIMIT 1;
dauert 0,2 Sekunden -> wunderbar

== Abfrage 2 ==

SELECT id FROM Tabelle WHERE (feld2 = '1') LIMIT 1;
dauert 2,1 Sekunden -> nicht tragbar!

Diese enormen Ladezeiten sind regelmäßig und kein einzelnes Ereignis. Bei jeder Abfrage kommen etwa die gleichen Zeiten heraus -> Woran liegt das? (Anmerkung : Die Menge der Datensätze die bei beiden Abfragen ohne LIMIT herauskommen würde ist gleich)

Hoffe es hat jemand eine Idee.

Gruß

  1. Hallo!

    Es werden zwei verschiedene Abfragen auf eine sehr große Tabelle (2,9 Mio Einträge) angewendet.

    == Aufbau Tabelle ==

    id(Primärschlüssel) > varchar(32)
    ...
    feld1 > double(16,4)
    ...
    feld2 > char(1)

    == Abfrage 1 ==

    SELECT id FROM Tabelle WHERE (feld1 = 1) LIMIT 1;
    dauert 0,2 Sekunden -> wunderbar

    == Abfrage 2 ==

    SELECT id FROM Tabelle WHERE (feld2 = '1') LIMIT 1;
    dauert 2,1 Sekunden -> nicht tragbar!

    Lege mal auf feld1 und feld2 einen Index. Höchstwahrscheinlich wird das die Sache beschleunigen.

    Überprüfe mit EXPLAIN ob der Index angewendet wird.

    André Laugks

    1. Moin!

      Lege mal auf feld1 und feld2 einen Index. Höchstwahrscheinlich wird das die Sache beschleunigen.

      Überprüfe mit EXPLAIN ob der Index angewendet wird.

      Falsche Reihenfolge!

      Erst EXPLAIN benutzen und gucken, ob irgendein Index verfügbar ist und benutzt wird.

      Erst DANN, wenn klar ist, dass die Indexnutzung optimierbar ist, weil derzeit ein Full Table Scan erforderlich ist, Indices einsetzen oder anpassen.

      - Sven Rautenberg

      --
      "Love your nation - respect the others."
      1. Hallo Leute,

        Vielen Dank für diese Hinweise (man lernt doch nie aus). Ich habe mit eurer Hilfe den Fehler entdeckt, es liegt wirklich an den Indizes. Feld1 hat einen, Feld2 nicht.

        Leider entsteht nun ein weiteres Problem : Ich kann keinen neuen Index anlegen! Wenn ich Feld2 als Index markiere passiert ein paar Minuten gar nichts und dann sagt mir das PLESK-System "Der Dienst ist zurzeit nicht verfügbar, möglicherweise ist Ihr Plesk falsch konfiguriert.
        Kontaktieren Sie Ihren Provider für Details" (ich denke das diese aber an den langen Ladezeiten liegt). Wie gesagt ist die Tabelle sehr groß (2,9 Mio Einträge + 3 GB Tabellengröße) - Wie bekomme ich nun einen Index definiert ?

        Gruß

        1. Moin!

          Leider entsteht nun ein weiteres Problem : Ich kann keinen neuen Index anlegen! Wenn ich Feld2 als Index markiere passiert ein paar Minuten gar nichts und dann sagt mir das PLESK-System "Der Dienst ist zurzeit nicht verfügbar, möglicherweise ist Ihr Plesk falsch konfiguriert.
          Kontaktieren Sie Ihren Provider für Details" (ich denke das diese aber an den langen Ladezeiten liegt). Wie gesagt ist die Tabelle sehr groß (2,9 Mio Einträge + 3 GB Tabellengröße) - Wie bekomme ich nun einen Index definiert ?

          Große Datenmengen benötigen viel Zeit zur Generierung eines Index. Das geht nicht in drei Sekunden. Wenn dein Plesk nicht darauf ausgerichtet ist, dass DB-Operationen auch mal länger dauern können, läuft es in einen Timeout und bringt unsinnige Meldungen.

          Nichtsdestotrotz wird die Datenbank im Hintergrund den Index anlegen - davon gehe ich jedenfalls mal aus.

          - Sven Rautenberg

          --
          "Love your nation - respect the others."
          1. Große Datenmengen benötigen viel Zeit zur Generierung eines Index. Das geht nicht in drei Sekunden. Wenn dein Plesk nicht darauf ausgerichtet ist, dass DB-Operationen auch mal länger dauern können, läuft es in einen Timeout und bringt unsinnige Meldungen.

            Nichtsdestotrotz wird die Datenbank im Hintergrund den Index anlegen - davon gehe ich jedenfalls mal aus.

            • Sven Rautenberg

            VIELEN DANK es stimmt

            Die Datenbank hat wohl eine ganze Zeit benötigt aber nun ist der Index da und die Abfrage ist ebenso schnell wie die erste - SUPER! Vielen Dank. Ich werde auch noch einmal in meinen eigenen Projekten nachschauen ob die Indizes korrekt/ausreichend gesetzt sind.

            Vielen Dank für eure Hilfe.

            Gruß

            1. Moin!

              Ich werde auch noch einmal in meinen eigenen Projekten nachschauen ob die Indizes korrekt/ausreichend gesetzt sind.

              Es ist während der Entwicklungszeit eines Projektes absolut nicht schlimm, wenn man bei der Erstellung der Datenbanktabellen zunächst gar keine Indices setzt (vielleicht mal mit Ausnahme des Primärschlüssels, den man z.B. in MySQL setzen muß, wenn man auto_increment benötigt). Annähernd leere Tabellen haben ja keinerlei Performanceprobleme, die stehen oft komplett im Cache und sind deshalb auch ohne Index sauschnell.

              Aber sobald man im Testsystem mehr und mehr realistische oder reale Daten gesammelt hat, kann man alle Querys mal durch EXPLAIN untersuchen und die Indizierung anpassen/optimieren.

              - Sven Rautenberg

              --
              "Love your nation - respect the others."