ich habe einige Zeit gegoogelt, jedoch keine passende Lösung gefunden...
Ich hoffe, das ihr mir helfen könnt, ein Update zu optimieren.
Leider wird in der Tabelle dauernd gelesen und geschrieben, jedoch verursachen die Updates bei mir 50% des gesamten Mysql-Traffics. Mysql 5; PHP 5
Syntax:
Bezeichnung: Tabelle Benutzer Datum Zahl
Indices: Primary Index Index Index
function zähleinenzu($benutzer) {
$today= date("m:d:y");
$query = "update benutzer set zahl=zahl+1 where benutzer=$benutzerid and date='today') limit1";
mysql_query($query);
if (mysql_affected_rows () == 0 mysql_query(insert zahl set benutzer=benutzerid, date='today', zahl=1");
}
was soll denn bitte an diesem statement noch verbessert werden? es ist ja nicht das problem, dass das statement so langsam ist, sondern dass es so oft aufgerufen wird...du solltest also lieber deine gesamte architektur überdenken...
falls das ganze ein zugriffs-counter sein soll: klaro, bei 1000 benutzern stündlich mit jeweils 100 zugriffen auf deiner seite muss der counter 100.000 mal aufgerufen werden - und wenn du jedesmal ein schreibendes sql-statement abschickst, ist das halt ein/der flaschenhals deiner applikation.
Wenn Deine Mysql Version aktuell genug und benutzerid ein unique key ist (zum Beispiel auto_increment primary key), hilft Dir INSERT ... ON DUPLICATE weiter. http://dev.mysql.com/doc/refman/5.0/en/insert.html
__________________
Wat der Bauer nich kennt, dit frisster nich.
Geändert von defabricator (01.12.2007 um 15:13:29 Uhr)
Ja.
Aber mal in die andere Richtung gedacht: wenn in 99.999999999999999% aller Fälle das UPDATE durchgeführt werden muss, warum führst Du im Moment zuerst das INSERT aus? Das ist doch dann wohl die unschlauste aller Vorgehensweisen, oder?
__________________
Wat der Bauer nich kennt, dit frisster nich.
Geändert von defabricator (01.12.2007 um 15:21:25 Uhr)
Bin jemand, der über halbwissen verfügt... lach...
Ich lese das so, das sinngemäss:
- mach update von zahl xy von benutzer trallala wo tag ist heute wenn du eins gefunden hast dann ende
- wenn das nicht ist dann mach neue zeile mit zahl 1 bei benutzer trallala und tag heute
Du kannst eine stored prcedure auf dem Server einrichten, so dass Du nur noch zum Beispiel die Abfrage
$sql = 'call uU('.$benutzerId.')';
abschicken musst.
__________________
Wat der Bauer nich kennt, dit frisster nich.
Geändert von defabricator (01.12.2007 um 15:33:11 Uhr)
Da aber die Updates immer nur zeilen betreffen, datum=heute haben würde sich doch ein order by date desc anbieten - ober nicht..?
Oder muss der dann zuviel sortieren..?
Wie kann ich vermeiden, das so oft die nächste Zeile gelesen wird..?
Oder wird der Index nicht richtig genutzt, so das ich besser force index benutze um ihn dazu anzuhalten..?
Wie gesagt, genug ram habe ich... Kann sort_buffer ruhig genug mb zuweisen