Announcement

Collapse
No announcement yet.

Warum wird SQL-Index nicht benutzt?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Warum wird SQL-Index nicht benutzt?

    Warum wird SQL-Index nicht benutzt?

    Beim Optimieren von Tabellen und Abfragen für eine Software bin ich auf das Phänomen gestoßen, dass INDEXe nicht verwendet werden, obwohl sie es meinem (vielleicht zu naiven) Verständnis nach sollten.

    Es ist ein Index auf losnr gesetzt.
    Bei dieser einfachen Abfrage wird er benutzt:

    EXPLAIN SELECT losnr FROM testORDER BY losnr LIMIT 0,50

    id select_type table type possible_keys key key_len ref rows Extra
    1 SIMPLE test index NULL losnr 4 NULL 50 Using index


    Sobald ich eine weitere Spalte mit Abfrage, nicht mehr (auch nicht wenn ich mit USE INDEX darauf bestehe):

    EXPLAIN SELECT losnr,nr FROM test ORDER BY losnr LIMIT 0,50
    id select_type table type possible_keys key key_len ref rows Extra
    1 SIMPLE test ALL NULL NULL NULL NULL 3330 Using filesort


    Durch den Index möchte ich natürlich eine bessere Perfomance beim Lesen erreichen.
    Wo liegt hier möglicherweise mein Denkfehler?

    Danke im Voraus für alle Antworten und weiterführenden Links!

  • #2
    Hallo,

    warum sollte der Index verwendet werden? Es gibt keinerlei einschränckende Where-Bedingung, die den Einsatz des Index rechtfertigen würde. Die Indexnutzung ist nicht zwangsläufig immer performanter! Immerhin muß der Server hier zweimal zugreifen - einmal auf den Index und einmal auf die Tabelle.

    Beim ersten Statement ist der Index sinnvoll, da hier alle abgefragten Werte bereits im Index stehen und somit kein zweiter Zugriff auf die eigentliche Tabelle notwendig wird.
    Die zweite Abfrage selektiert zusätzlich ein Feld ausserhalb des Index. Hier erscheint es dem Server also sinnvoller auf den zusätzlichen Indexzugriff zu verzichten und stattdessen ein einfaches file sort zu verwenden, was - in Abhängigkeit der Anzahl der DS und des verfügbaren Hauptspeichers - durchaus schneller ist als die Sortieung mit Hilfe des Index vorzunehmen.

    Unter der Prämisse das 0 der kleinste mögliche Wert für losnr ist, kannst du ja mal versuchen den Optimizer mit WHERE losnr >= 0 auf eine falsche Fährte zu locken .

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Hallo Falk, danke erstmal für Deine ausführlichen Antworten zu beiden Fragen.


      Wenn ich nun zu den gefundenen Einträgen weitere Merkmale aus einer anderen Tabelle auslesen möchte, ist es dann grundsätzlich sinnvoll, im gleichen Statement auf beide Tables zuzugreifen? Auch dort scheint mir nämlich der - meinem Verständnis nach suboptimale - Ansatz performanter, zunächst die einfache obige Abfrage auszuführen und dann für jede gefundene Zeile eine weitere Abfrage auf die andere Table durchzuführen.

      SELECT artikelnr FROM test ORDER BY losnr LIMIT 0,50
      und dann für jede gefundene Zeile:
      SELECT name,preis,.... usw... FROM merkmale WHERE artikelnr='$artikelnr'

      Comment


      • #4
        Hallo,

        für dieses Problem genügt ein einfacher Join und der ist in jedem Fall performanter als die Schleifenlösung.
        Überlass das Finden des besten Ausführungspfades getrost dem Optimizer der DB. Für diesen habe sich viele schlaue Leute bereits den Kopf zerbrochen
        Ansonsten hilft da nur Erkentniss durch probieren.

        Gruß Falk
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment

        Working...
        X