Struppi: Index wird nicht bei Date Operationen benutzt?

Ich hab grad gesehen, dass wenn ich eine solche Abfrage benutze, mySQL keinen Index verwendet.

EXPLAIN SELECT k . * , DAYOFMONTH( k.datum ) AS tag, u.showName, DATE_FORMAT( k.date, "%d.%m.%Y %H:%i" ) AS date_f  
FROM kalender AS k  
LEFT JOIN users AS u ON k.user = u.name  
WHERE MONTH( k.datum ) =11  
AND YEAR( k.datum ) =2005

und zwar ist der Index von k auf datum und user, offensichtlich werden diese aber durch MONTH() und YEAR() nicht mehr benutzt.

k   ALL   NULL   NULL   NULL   NULL   147   Using where
u  eq_ref  PRIMARY  PRIMARY  20  k.user  1
Oder interpretiere ich das falsch?

Struppi.

  1. Hi,

    und zwar ist der Index von k auf datum und user, offensichtlich werden diese aber durch MONTH() und YEAR() nicht mehr benutzt.

    richtig. Wenn man bewusst verhindern will, dass z.B. bei einer nummerischen Spalte ein zugehöriger Index benutzt wird, selektiert man einfach "... WHERE spalte+0 ...". Der Index geht schließlich nur über die Spalte, nicht über Berechnungen mit dieser.

    Oder interpretiere ich das falsch?

    Nö, absolut richtig. Bei MONTH() würde ich sogar unterstellen, dass ein Index gegenüber einem Full Table Scan ineffektiv ist. Ob MySQL Function Based Indexes unterstützt, kann ich Dir allerdings nicht sagen.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes