P. Müller: MySql: comparision of date

Hallo Leute,

ich habe ein Problem bei einem Datumstype date.
Wenn ich einen Vergleich durchführe wie:

....where datum = '2004-01-10'.... nutzt mysql den index, den ich auf das Feld gelegt habe. (Kann man ja mit explain anzeigen lassen.)

Wenn ich aber folgendes mache:
....where datum >= '2004-01-10'..... nutzt mysql den Index nicht.

Kann mir jemand sagen, ob es einen besseren Vergleich gibt?
Ich muß in Sache etwas mehr Geschwindigkeit bringen!

Vielen Dank!

Peter

  1. Halihallo P.

    Wenn ich aber folgendes mache:
    ....where datum >= '2004-01-10'..... nutzt mysql den Index nicht.

    Nicht zwingend, ja. Aber MySQL wird den Index benutzen, sobald es
    Sinn macht.

    Kann mir jemand sagen, ob es einen besseren Vergleich gibt?

    Nein.

    Ich muß in Sache etwas mehr Geschwindigkeit bringen!

    Das musst nicht du, das ist die Aufgabe der Datenbank [1]! Diese
    entscheided wie eine Anfrage am schnellsten ausgeführt werden kann
    und in deinem Beispiel muss sie einen Grund haben um den Index nicht
    zu verwenden. Mögliche Ursachen die die Verwendung eines Index
    unterbinden findest du in der Doku. Beispiele sind: Index, indem
    der gesuchte Indexwert mehr als 30% der gesamten Tupel (Datensätze)
    betrifft, zu kleine Tabelle... etc. Wenn bei dir z.B. 30% Datensätze
    nach 2004-01-10 sind, wird MySQL deinen Index nicht benutzen.

    Fazit: MySQL benutzt deinen Index, wenn es Sinn macht. Überlasse die
    Entscheidung der Datenbank, denn sie weiss besser wann ein Index Sinn
    macht (bzw. man kann es auch steuern, wenn sie sich mal irren
    sollte).

    [1] du gibst ihr lediglich Eckdaten/-information wie z.B. welche
    Attribute als INDEX oder UNIQUE INDEX verwendet werden dürfen etc.
    MySQL entscheided aber selber, ob die Verwendung des Index Sinn macht
    oder nicht (das gibt es nämlich auch!).

    Viele Grüsse

    Philipp

    1. yo,

      Das musst nicht du, das ist die Aufgabe der Datenbank [1]! Diese
      entscheided wie eine Anfrage am schnellsten ausgeführt werden kann
      und in deinem Beispiel muss sie einen Grund haben um den Index nicht
      zu verwenden.

      dbms sind auch nur "menschen", bzw. sind von menschenhand gemacht worden und irren sich einfach mal. oracle kennt genau aus diesen grund sogenannte hints, die den otpimierer zu bestimmten entscheidungen "überreden" (nicht zwingen). insofern könnte ich mir vorstellen, dass es sowas auch unter mysql gibt, bin mir da aber sehr unsicher.

      Ilja

      1. Halihallo Ilja

        Das musst nicht du, das ist die Aufgabe der Datenbank [1]! Diese
        entscheided wie eine Anfrage am schnellsten ausgeführt werden kann
        und in deinem Beispiel muss sie einen Grund haben um den Index nicht
        zu verwenden.

        dbms sind auch nur "menschen", bzw. sind von menschenhand gemacht worden und irren sich einfach mal. oracle kennt genau aus diesen grund sogenannte hints, die den otpimierer zu bestimmten entscheidungen "überreden" (nicht zwingen). insofern könnte ich mir vorstellen, dass es sowas auch unter mysql gibt, bin mir da aber sehr unsicher.

        Aber bestimmt, das ist natürlich alles richtig. Darauf angespielt
        habe ich auch über
        <cite>(bzw. man kann es auch steuern, wenn sie sich mal irren
        sollte).</cite>. Nun, was heisst hier alles richtig??? - DBMS sind
        keine Menschen und sie irren sich nie (Programme und Computer irren
        nicht, nur deren Erschaffer)! :-)

        Hints zur Optimierung gibt es auch bei MySQL. z.B. unter
        MySQL: Join

        Viele Grüsse

        Philipp