Suchmaschinenoptimierung
   
 

SEMSEO Konferenz 2012
 

 
 

MySQL Query-Cache vs. NOW() und CURDATE()

Neues Thema eröffnen   Neue Antwort erstellen    ABAKUS Foren-Übersicht -> Webprogrammierung, Templatedesign & Microformats
 Voice zu Text Programm? Google stellt Unterstuetzung fuer IE6 ab 1.3.2010 ein  
Synonym

pr


: 09.08.2008
: 3354
: Würzburg


: 29.01.2010, 19:42    : MySQL Query-Cache vs. NOW() und CURDATE() Antworten mit Zitat

Hallo zusammen,

ich stehe hier gerade vor einem Problem (seltsamen Zustand) den ich mir nicht erklären kann.

In einer Query wird das aktuelle Datum berücksichtigt und anhand dessen die Datensätze ausgewählt.

So, anfangs hatte ich dazu immer NOW(), doch Minuten und Sekunden brauche ich gar nicht. Also verwende ich aktuell CURDATE() um die Daten zu vergleichen.

Dachte eigentlich auch, dass diese Queries so cachebar wären, aber dem ist wohl nicht so.

Die komplette Query braucht mit NOW() oder CURDATE 0.3 Sek. Selbige Query in der Folge dauert genauso lange und kommt in dem Fall nicht aus dem QCache. Dachte ich aber, da die Query sich ja nicht ändert.

Nehme ich aber anstelle von NOW oder CURDATE einen festen Wert wie '2010-01-28', dann dauert die Query immer noch 0.3 Sek, aber nur beim ersten Aufruf. Alle weiteren kommen aus dem Cache.

So, gibt es dafür eine Erklärung?

Ich dachte bisher wirklich, dass Queries mit mysql-Funktionen als "statisch" betrachtet werden, eben nicht wie eine mit PHP time() die sich bei jedem Aufruf ändert.

Nachtrag: Hm, da hätte ich wohl vorher mal in die Doku sehen sollen. Bei Verwendung einer MySQL-Funktion wird der Cache nicht benutzt. Das ist ja unfug. Also doch per PHP vorher das ganze erledigen und dann Abfragen.
Nach oben
Synonym Private Nachricht senden
everflux

pr


: 01.05.2006
: 936



: 30.01.2010, 12:07    : MySQL Query-Cache vs. NOW() und CURDATE() Antworten mit Zitat

Genau, da hast du die Loesung auch direkt mit geschrieben.
Alternativ kannst Du das Ergebnis der Abfrage selber in php noch cachen und Dir so die gesamte Abfrage sparen, wenn die lediglich vom aktuellen Datum abhaengt. Dann hast Du nur einen cache-miss pro Tag

http://everflux.de/ blogging about life, programming, seo and the net
Nach oben
everflux Private Nachricht senden WWW
Synonym

pr


: 09.08.2008
: 3354
: Würzburg


: 30.01.2010, 12:19    : MySQL Query-Cache vs. NOW() und CURDATE() Antworten mit Zitat

Ja ne, das Ergebnis direkt cachen kann ich nicht, das kann sich nämlich schon öfters ändern, aber die eigentliche Query nicht. Die ändert sich eigentlich nie und sollte nur einen Vergleich machen zwischen dem aktuellen Tag und einem Zeitraum aus der Datenbank (Ferientermine). Mit PHP ist das ja kein Thema, aber verwundert hat mich das schon. Zumal man ja immer sagt "Was die Datenbank erledigen kann, das sollte sie auch erledigen". Und dann gibt es zig Daten-Funktionen und die verhindern das Cachen. Ist aus meiner Sicht echt unfug. Komischerweise aber ein from_unixtimestamp('mit Wert') nicht. Hm, egal, dann baue ich es halt wieder zurück wie es mal vor vielen Monaten war
Nach oben
Synonym Private Nachricht senden
profo

pr


: 18.01.2007
: 1709



: 30.01.2010, 12:44    : MySQL Query-Cache vs. NOW() und CURDATE() Antworten mit Zitat

Synonym hat Folgendes geschrieben:
Komischerweise aber ein from_unixtimestamp('mit Wert') nicht.

Das ist doch eigentlich auch alles richtig. Das "now()" ändert sich ja bei jedem Aufruf, die Query kann mysql deshalb natürlich nicht cachen. Das "from_unixtimestamp(fester Wert)" wertet mysql eben als festen, unveränderlichen Wert aus, und kann die Query deshalb auch cachen.

Es kommt beim Cachen doch nicht darauf an, dass die Query gleich aussieht, sondern dass sie die identische Abfrage mit identischen Ergebnissen gibt... Ein "select rand()" sieht ja auch immer gleich aus, aber Du würdest an die Decke gehen, wenn MySQL das cachen würde
Nach oben
profo Private Nachricht senden
Synonym

pr


: 09.08.2008
: 3354
: Würzburg


: 30.01.2010, 14:19    : MySQL Query-Cache vs. NOW() und CURDATE() Antworten mit Zitat

@profo

Ja, das ist schon richtig. Da hatte ich falsch gedacht. Ich hing direkt an der Query fest, ob die nun immer gleich ist oder nicht.

und ein CURDATE() war für mich "gleich", ein PHP time() nicht.

:
Es kommt beim Cachen doch nicht darauf an, dass die Query gleich aussieht, sondern dass sie die identische Abfrage mit identischen Ergebnissen gibt

Richtig, aber dennoch ist es dann seltsam oder nur schwer verständlich. Denn auch ein CURDATE() liefert binnen eines Tages den gleichen Wert. Bei NOW() könnte ich es noch verstehen, wenn man davon ausgeht, dass die Funktion zuerst aufgelöst wird, denn dann ist es nichts anderes wie ein time(), aber bei CURDATE() nicht.
Nach oben
Synonym Private Nachricht senden
profo

pr


: 18.01.2007
: 1709



: 30.01.2010, 14:38    : MySQL Query-Cache vs. NOW() und CURDATE() Antworten mit Zitat

Synonym hat Folgendes geschrieben:
Richtig, aber dennoch ist es dann seltsam oder nur schwer verständlich. Denn auch ein CURDATE() liefert binnen eines Tages den gleichen Wert.

Bei einem Funktionsaufruf mit nichtvorhersagbarem Ergebnis in der Query (curdate(), time(), subselect, usw.) sagst Du der Datenbank eigentlich explizit: bitte nicht cachen.

Mit einem "erst Query zusammenbauen, dann die zusammengebaute Query im Cache nachschlagen" würden sich die Datenbankler eine Reihe von Problemen aufhalsen, nur um ein Problem zu lösen, das vom falschem Gebrauch herstammt. Goldene Regel: eine Query selbst zusammenbauen und so einfach wie möglich halten.
Nach oben
profo Private Nachricht senden
Synonym

pr


: 09.08.2008
: 3354
: Würzburg


: 30.01.2010, 14:56    : MySQL Query-Cache vs. NOW() und CURDATE() Antworten mit Zitat

Ja klar, so mache ich das nun ja auch wieder. Hatte ich ja auch schon zuvor so. Da das aber bei allen Daten-Funktionen so ist frage ich mich da aber dann schon wozu man die dann eigentlich effektiv nutzen sollte / könnte. Wenn ich das eh mit PHP vorher machen muss, dann kann ich auch gleich einen Unix-Timestamp in die DB schreiben, das ist einfacher und geht schneller als ein DATE oder DATETIME oder TIMESTAMP von MySQL und dieses "umformen" in YYYY-MM-DD kann man sich dann auch sparen. Daher auch meine Gedanken.... Hatte das daher vorher auch nicht getestet. Ich dachte einfach die MySQL-eigenen Funktionen würden effektiver mit der DB zusammenarbeiten.
Nach oben
Synonym Private Nachricht senden
profo

pr


: 18.01.2007
: 1709



: 30.01.2010, 15:06    : MySQL Query-Cache vs. NOW() und CURDATE() Antworten mit Zitat

Der Gedanke liegt ein bisschen nahe, weil die Datenbanken heute so verflixt viel können. Letzten Endes sind sie am effizientesten aber immer noch zu gebrauchen, wenn Du sie so weit es nur geht in Ruhe und so wenig und selten wie möglich arbeiten lässt

Übrigens, das Umwandeln in einen menschenlesbaren Zeitstempel war tatsächlich eher unnütz. Als Zeitfeld benutzen die meisten einfach einen besser performenden int(11) oder so, den Du mit time() bzw. in MySQL mit unix_timestamp() füllen kannst...
Nach oben
profo Private Nachricht senden
Synonym

pr


: 09.08.2008
: 3354
: Würzburg


: 30.01.2010, 15:23    : MySQL Query-Cache vs. NOW() und CURDATE() Antworten mit Zitat

Arg.... "Als Zeitfeld benutzen die meisten einfach einen besser performenden int(11) oder so, den Du mit time() bzw. in MySQL mit unix_timestamp() füllen kannst"
So hatte ich das ja zuvor Und dann der Umstieg auf die MySQL-Date-Funktionen. Wobei.... unix_timestamp() ganz sicher nicht.... Nene, ich bleibe dann wieder beim schönen alten time()
Nach oben
Synonym Private Nachricht senden
profo

pr


: 18.01.2007
: 1709



: 30.01.2010, 15:28    : MySQL Query-Cache vs. NOW() und CURDATE() Antworten mit Zitat

Früher war alles besser
Nach oben
profo Private Nachricht senden
800XE

pr


: 02.12.2004
: 5121
: XENEVU


: 30.01.2010, 19:51    : MySQL Query-Cache vs. NOW() und CURDATE() Antworten mit Zitat

Synonym hat Folgendes geschrieben:
Da das aber bei allen Daten-Funktionen so ist frage ich mich da aber dann schon wozu man die dann eigentlich effektiv nutzen sollte / könnte.

na, in Abfragen wo nicht geCacht wird
(stell dir mal vor Airbag oder ABS hätten ein Caching .... bei Toyota wurde das glaub gerade bei den Gasspedalen eingebaut )

Was war zuerst da
Diese DatenFunktionen oder das Caching?

oder nach deiner Frage
(die Frage stelle ich hirmit wirklich ernsthaft)
was wurde "erfunden" was nicht hätte erfunden werden sollen(brauchen)
- Das Caching
- Die Datenfunktionen

abschweiff ....
... bei CPUs sind ja da auch voll die Auswüchse
erst gabs die Chaches in der CPU, Speicheraches
Dann gabs die Pipelines, das mehrere Befehle gleichzeitig durch die CPU laufen
dann wurden die Pipelines mehrspurig weil ja nach einem IF oderSo die "aktuelle" Spur in den Graben fährt ....

aber nur ... /Affilitiv/ ... innovativ
Nach oben
800XE Private Nachricht senden WWW
800XE

pr


: 02.12.2004
: 5121
: XENEVU


: 30.01.2010, 19:54    : MySQL Query-Cache vs. NOW() und CURDATE() Antworten mit Zitat

Synonym hat Folgendes geschrieben:
Wobei.... unix_timestamp() ganz sicher nicht.... Nene, ich bleibe dann wieder beim schönen alten time()

ich arbeite auch mit dem time()


aber, Achtung

Y2K .... der kommt ... 2026 oder 2027 kommt der dort, wenn die den nicht von 32(bzw31) Bit auf 64 oder so "aufbohren"
(oder ist der jetzt nur bei 16 bzw 15 Bit?)

www.800xe.de/hphilo/Y2K-Bug-2027.html
:
Im Februar 2027 war es dann soweit und der Integer ist übergelaufen.


aber nur ... /Affilitiv/ ... innovativ
Nach oben
800XE Private Nachricht senden WWW
Neues Thema eröffnen   Neue Antwort erstellen    ABAKUS Foren-Übersicht -> Webprogrammierung, Templatedesign & Microformats
Seite 1 von 1

 






Ähnliche Beiträge
Thema Forum Antworten
htaccess Cache Einstellung blockt Analytics htaccess Cache Einstellung blockt Ana... sisslik Web Analytics & Controlling 0 05.02.2012, 08:36 htaccess Cache Einstellung blockt Analytics
MySQL Update Befehl MySQL Update Befehl nadthom Webprogrammierung, Templatedesign & Microformats 0 27.01.2012, 15:51 MySQL Update Befehl
MySQL for Hatkeinplan MySQL for Hatkeinplan Markus_S Webprogrammierung, Templatedesign & Microformats 21 19.01.2012, 08:11 MySQL for Hatkeinplan
MySQL-Befehls-Syntax MySQL-Befehls-Syntax Linkbuilder_Bochum Webprogrammierung, Templatedesign & Microformats 3 28.11.2011, 11:31 MySQL-Befehls-Syntax
Coder gesucht (PHP/MYSQL/Javascript/CSS) Coder gesucht (PHP/MYSQL/Javascript/CSS) matthias116 Marktplatz: Dienstleistungen 0 29.10.2011, 15:17 Coder gesucht (PHP/MYSQL/Javascript/CSS)
Cache: Werden alle Banner Impressions gewertet? Cache: Werden alle Banner Impressions... Lurker Ich hab' da mal 'ne Frage 5 21.10.2011, 15:06 Cache: Werden alle Banner Impressions gewertet?
Google Cache Google Cache MaikIhde Google Forum 2 11.10.2011, 21:48 Google Cache

Suchmaschinenoptimierung | Latent Semantische Optimierung (LSO) | SEO Blog | SEO Online Tools | Suchmaschinenmarketing Angebot | Online Marketing

Impressum

Dieses SEO Forum läuft unter phpBB.


Sie lesen gerade: MySQL Query-Cache vs. NOW() und CURDATE()