Herzlich willkommen im Archiv vom ABAKUS Online Marketing Forum
Du befindest Dich im Archiv vom ABAKUS Online Marketing Forum. Hier kannst Du Dich für das Forum mit den aktuellen Beiträgen registrieren.
Gut, dann werde ich mein Debugging gleich um die SQL_NO_CACHE-Variante erweitern. Dann sehe ich die Zeiten für den lokalen Filecache (falls vorhanden), der DB-Abfrage, Explain und eben ohne SQL-Cache. Das sollte dann zum Vergleich genügen.lunetics hat geschrieben:Durchgelesen und mal ein paar tips:
Querytests IMMER mit Select SQL_NO_CACHE * from...
Ich habe sowohl alte als auch aktuelle Lektüre studiert und auch diesen Test unter anderem gefunden:Innodb ist sinnvoll wenn es viele writes gibt.
Aktuell ist die Volltextsuche noch recht performant. Wobei das ähnlich abläuft wie zuvor. Wenn die DB entlastet ist, dann dauert eine Volltextsuche ca. 2-3 Sekunden. Bei Auslastung kann das schon mal 30 Sekunden dauern. Aber: Ich werfe die Ergebnisse in der Regel über einen Cache aus. Das kann ich machen, weil bei mir die Sortierung priorisiert nach Genauigkeit abläuft. Dieser Cache bleibt 30 Tage lang stabil. Ich könnte vermutlich auch 90 Tage draus machen. Die User haben es bis heute nicht gemerkt. Übrigens kann ich das jedem Forumbetreiber nur empfehlen. Bei der Suche nach Genauigkeit kommen auch ältere Themen zum Vorschein, so dass doppelte Themen reduziert werdenNiemals Fulltext benutzen, wenn es ein wirklich grosses Forum ist und du eine Volltextsuche brauchst -> SOLR oder Sphinx.
Auf Grund der Kompatibilität wurde xCache schon vor längerer Zeit installiert. Dieser hat eine ganze Menge gebracht.Die grösste Steigerung sollte wohl z.b. memcached bringen, d.h. die Daten im objektcache (memcached) halten, sobald neuer Post -> invalidieren. Das würde auch komplett die Datenbank entlasten, da dort keine abfrage stattfindet. Eventuell eine Kombination von APC/xcache varcache (je nachdem wie dein system aufgebaut ist) und / oder memcached (falls mehrere webserver im einsatz sind)
Die überlasse ich den Technikern von All-Inkl.comAuch ist das config des Mysql servers sehr wichtig.
Aktuell kann ich nur nach Ausführungszeit gehen, da ich keinen Zugriff auf die Kommandozeile besitze. Solange ich das aber nicht ausgereizt habe, sollte das auch nicht nötig sein.Mittels Maatkit solltest du z.b. herausfinden können, welche Queries genau die meiste last verursachen etc.pp.
Die eine oder andere Sache hat mir schon geholfen. Das Problem ist, dass wenig Seiten im Netz Schlagworte aufführen, wie sie xAaron in seinem ersten Beitrag aufgeführt hatte. Dank so einer Liste, kann man zumindest mal recherchieren, was für einen selbst sinnvoll ist.Auf jeden fall ist das Thema Datenbankoptimierung /Queryoptimierung so komplex, dass es kaum in einen Thread passt
Nicht unbedingt. Wenn der Query ein Read/Write Verhältnis deutlich zugunsten Read hat und der Query oft genug abgefeuert wird, das er im Query Cache kann das reichen. Taucht der Query denn im Slow Log auf, wenn du das auf Queries >= 1s konfigurierst?mgutt hat geschrieben: Doch was ist, wenn eine Abfrage ohne SQL-Cache langsam ist. Heißt das, dass ich da noch optimieren muss?
Unter Low Memory Conditions hat MyIsam noch Vorteile, aber das ist bei aktuellen Rechnern tatsächlich kaum noch der Fall. Bei mir hat der Umstieg einer ca. 18 GB grossen Datenbank von MyIsam auf InnoDB auf einem Rechner mit 16 GB Speicher (12 davon für InndoDB) einen Geschwindigkeitsgewinn von mehr als 50% gebracht.Mittlerweile empfiehlt eigentlich jeder InnoDB, auch wenn man keine Transaktionen oder Fremdschlüssel benötigt.
Vorsicht, da gibts einige Fallstricke. Einfache Queries der Form "SELECT count(*) FROM table" (also ohne WHERE Clause) dauern plötzlich unendlich lange da InnoDB hier immer einen Fulltable Scan machen muss. Du solltest also sicherstellen, dass du derartige Sachen nicht mehr Code hast. Auch bei Indizes gibts ein paar Unterschiede, du solltest aufpassen das du die Primary Keys nicht nochmal in einem Index drin hast. Alles in allem: vor dem Umstieg gut Testen, vor allem eben einen umfangreichen Lasttest machen.Ich denke ich werde daher bald auf InnoDB wechseln.
Dazu wurde bereits alles gesagt. Relationale Datenbanken sind nicht für Volltextsuche gebaut, das ist ein echtes No-Go.[...] Fulltext [...]
Hilft eigentlich immer wenn du PHP benutzt. Andere Spachen/Frameworks wie z.b. Java/J2EE haben hier einen Applicationscope, in dem sie Requestübergreifend Objekte im Hauptspeicher halten können. Aber am meisten hilft memcached eben dann, wenn du mehr als einen Renderserver verwendest. Je mehr du davon im Einsatz hast, um so grösser ist der Effekt eines memcached-servers/clusters.[...] memcached [...]
Naja, die haben sicher ihre 0815 Konfiguration. Mindestens wenn du tatsächlich auf InnoDB umsteigen willst solltest du kontrollieren ob der Server dafür gut eingerichtet ist. Wenn er 8 GB Speicher hat, aber InnoDB davon nur 512MB bekommt, dann wirst du sonst hier im Forum bald berichten können, wie langsam InndoDB istAuch ist das config des Mysql servers sehr wichtig.Die überlasse ich den Technikern von All-Inkl.com
Ich würde dir empfehlen, vor dem Wechsel der Storage Engine ausgiebige Tests zu fahren. InnoDB verhält sich in vielen Dingen anders als MyIsam. Dem von dir verlinkten Test würde ich nur bedingt Aufmerksamkeit schenken, da in der Realität die Abfragen doch um einiges komplexer sind. Es lässt sich definitiv nicht pauschalisieren, dass InnoDb schneller ist als MyIsam.mgutt hat geschrieben:Ich habe sowohl alte als auch aktuelle Lektüre studiert und auch diesen Test unter anderem gefunden:Innodb ist sinnvoll wenn es viele writes gibt.
https://www.mysqlperformanceblog.com/20 ... ks-part-1/
Früher wurde immer gesagt, dass InnoDB langsamer sei als MyISAM. Diese Aussagen wurden aber in den aktuellen Berichten revidiert. Mittlerweile empfiehlt eigentlich jeder InnoDB, auch wenn man keine Transaktionen oder Fremdschlüssel benötigt.
Ich denke ich werde daher bald auf InnoDB wechseln.
Überlege dir das noch einmal. Unter Umständen ist der Server noch mit den Standard Einstellungen konfiguriert. Diese Einstellungen sind tatsächlich entscheidend, was die Performance der DB angeht. 3-4 Einstellungen erzielen oftmals eine ungeahnte Wirkung. Es reicht aus, den Technikern mitzuteilen, dass sie beispielsweise den Query Cache (query_cache_size) von xxxx auf yyyy anheben möchten - das sollte keine Probleme verursachen.mgutt hat geschrieben:Die überlasse ich den Technikern von All-Inkl.comAuch ist das config des Mysql servers sehr wichtig.
bfs hat geschrieben: Unter Low Memory Conditions hat MyIsam noch Vorteile, aber das ist bei aktuellen Rechnern tatsächlich kaum noch der Fall. Bei mir hat der Umstieg einer ca. 18 GB grossen Datenbank von MyIsam auf InnoDB auf einem Rechner mit 16 GB Speicher (12 davon für InndoDB) einen Geschwindigkeitsgewinn von mehr als 50% gebracht.
Wenn ich die aktiv hätte, würden sie da auftauchen. Die Slow Logs sind wenig aussagekräftig, da sie eben nur nach Zeit auswerfen und nicht die aktuelle Performance berücksichtigen. In dem Bereich, wo ich jetzt optimiere kommen daher sogar die schnellsten Abfragen mal in die Slow Logs. Das bringt also nicht wirklich was.bfs hat geschrieben:Nicht unbedingt. Wenn der Query ein Read/Write Verhältnis deutlich zugunsten Read hat und der Query oft genug abgefeuert wird, das er im Query Cache kann das reichen. Taucht der Query denn im Slow Log auf, wenn du das auf Queries >= 1s konfigurierst?
Das hört sich verlockend anBei mir hat der Umstieg einer ca. 18 GB grossen Datenbank von MyIsam auf InnoDB auf einem Rechner mit 16 GB Speicher (12 davon für InndoDB) einen Geschwindigkeitsgewinn von mehr als 50% gebracht.
Gibt es eine Seite, wo man sich über sowas informieren kann?Vorsicht, da gibts einige Fallstricke. Einfache Queries der Form "SELECT count(*) FROM table" (also ohne WHERE Clause) dauern plötzlich unendlich lange da InnoDB hier immer einen Fulltable Scan machen muss.
D.h. es darf in keinem Fall ein Index ein Primary Key enthalten? Auch nicht, wenn ich einen mehrspaltigen Index habe?Auch bei Indizes gibts ein paar Unterschiede, du solltest aufpassen das du die Primary Keys nicht nochmal in einem Index drin hast.
Also ist Deine Empfehlung ebenfalls Sphinx?Dazu wurde bereits alles gesagt. Relationale Datenbanken sind nicht für Volltextsuche gebaut, das ist ein echtes No-Go.[...] Fulltext [...]
Vielleicht missverstehe ich die Einsatzmöglichkeit von memcached. Ich dachte jetzt daran bestimmte SQL-Results im Arbeitsspeicher als PHP-Array bereitzuhalten oder geht es bei memcached noch um mehr wie z.B. Templates im Arbeitsspeicher zu halten oder wie?Hilft eigentlich immer wenn du PHP benutzt. Andere Spachen/Frameworks wie z.b. Java/J2EE haben hier einen Applicationscope, in dem sie Requestübergreifend Objekte im Hauptspeicher halten können. Aber am meisten hilft memcached eben dann, wenn du mehr als einen Renderserver verwendest. Je mehr du davon im Einsatz hast, um so grösser ist der Effekt eines memcached-servers/clusters.[...] memcached [...]
Ich denke ich kann schon darauf vertrauen, dass ein DB-Server der explizit als solcher eingekauft wird, entsprechend optimiert wurde (also RAM nahezu 100% MySQL zugeordnet wurde). Später muss ich allerdings aktiv um eine weitere Optimierung bitten. Das stimmt natürlich. Aber das habe ich in der Vergangenheit schon öfter gemacht und es wurde auch immer was getan. Allerdings habe ich noch nie Optimierungen in der MySQL-Config "gespürt". Da merke ich mehr, wenn ich eine Abfrage völlig dezimiere oder cache.Naja, die haben sicher ihre 0815 Konfiguration. Mindestens wenn du tatsächlich auf InnoDB umsteigen willst solltest du kontrollieren ob der Server dafür gut eingerichtet ist. Wenn er 8 GB Speicher hat, aber InnoDB davon nur 512MB bekommt, dann wirst du sonst hier im Forum bald berichten können, wie langsam InndoDB ist
Code: Alles auswählen
function update_rand() {
switch (mt_rand(2, 5)) {
case 2:
if (mt_rand(1, 2) == 2) {
return 2;
}
break;
case 3:
if (mt_rand(1, 3) == 3) {
return 3;
}
break;
case 4:
if (mt_rand(1, 4) == 4) {
return 4;
}
break;
case 5:
if (mt_rand(1, 5) == 5) {
return 5;
}
break;
}
return false;
}
// increment the number of views
if ($views = update_rand()) {
$sql = 'UPDATE LOW_PRIORITY topics
SET views = views + ' . intval($views) . '
WHERE topic = ' . intval($topic);
$db->sql_query($sql, false, __LINE__, __FILE__);
}
Der Server läuft mit max_connections=120 und bedient 6 Renderserver, die jeweils bis zu 20 persistente/gepoolte Connections aktiv haben. In Spitzenbelastungszeiten werden davon vielleicht 80 tatsächlich Traffic haben, aber das ist grob geschätzt. Die Read/Write Ratio liegt über alle Queries bei ca. 1:100, also recht typisch für Foren.bloddy newbie hat geschrieben:Wir projektieren aktuell eine 60GB Datenbank zu großen Teilen auf InnoDB umzustellen. Mich würde daher interessieren, wie viele gleichzeitige Benutzer in deinem Fall auf die Datenbank zugreifen (ungefähr)? Eine Replikation wurde bereits auf InnoDB umgestellt und hier hatten wir das Problem, dass die Indexe zu gelaufen sind. Wie auch immer das passieren konnte...
Wären da zwei Tabellen nicht besser?im prinzip zerlegst du dein volltext-feld in die einzelnen woerter und speicherst dann wort und zugehoerige id (und eventuell noch wie oft das wort in dem artikel vorkommt) in einer weiteren tabelle
Ich hab immer ein slow log mit >= 3 sec mitlaufen. du hast recht, wenn die load auf der db gross ist, tauchen da auch "normale" Queries auf, aber meist findet man unter den aufgelisten Queries trotzdem den Verursacher. So kann man einfach eine gewisse Hygiene halten.mgutt hat geschrieben: Wenn ich die aktiv hätte, würden sie da auftauchen. Die Slow Logs sind wenig aussagekräftig, da sie eben nur nach Zeit auswerfen und nicht die aktuelle Performance berücksichtigen. In dem Bereich, wo ich jetzt optimiere kommen daher sogar die schnellsten Abfragen mal in die Slow Logs. Das bringt also nicht wirklich was.
Kenne ich jetzt nicht, würde ich aber dazu sind wir ja alle Google Expertenmgutt hat geschrieben:Gibt es eine Seite, wo man sich über sowas informieren kann?
Na du musst einfach nur bedenken, das inndob an JEDEN Index immer als letzten Wert den PK anhängt. Deswegen solltest du bei InnoDB auch lange PK's vermeiden, weil sie deine Indizes aufblähen.D.h. es darf in keinem Fall ein Index ein Primary Key enthalten? Auch nicht, wenn ich einen mehrspaltigen Index habe?
Ich kenne Sphinx nicht gut genug um da wirklich eine saubere Empfehlung abgeben zu können. Ich selbst setze direkt auf einer Lucene-basierten Eigenimplementierung auf und das ist nunmal das Such-Framework #1. Da SOLR auch Lucene-basiert ist, würde ich wohl eher dazu raten.Also ist Deine Empfehlung ebenfalls Sphinx?
Memcached cached Objekte, also prinzipiell kannst du dort alles vorrätig halten, sogar Binärdaten. Aber am meisten Sinn aus Aufwand/Nutzen-Sicht machen sicher Query-Ergebnisse oder eben auch HTML Schnipsel.Vielleicht missverstehe ich die Einsatzmöglichkeit von memcached. Ich dachte jetzt daran bestimmte SQL-Results im Arbeitsspeicher als PHP-Array bereitzuhalten oder geht es bei memcached noch um mehr wie z.B. Templates im Arbeitsspeicher zu halten oder wie?
Habe ich und bin prompt auf Abakus gestoßen, sonst aber nichts wirklich informatives gefundennerd hat geschrieben:such mal nach 'pre-index' als schnelle und flexiblere alternative.
Das halte ich für ein Gerücht. Dieses System war damals in phpBB2 Standard und es ist wird immer langsamer, umso mehr Beiträge man hat. Gerade das Hinzufügen von Beiträgen wird dann zu einer Geduldsprobe. Damit das dann halbwegs performant abläuft filterte phpBB2 common-Wörter aus und bestimmte Inhalte wie Links wurden auch ignoriert, aber unter dem Strich war das System sehr langsam.im prinzip zerlegst du dein volltext-feld in die einzelnen woerter und speicherst dann wort und zugehoerige id (und eventuell noch wie oft das wort in dem artikel vorkommt) in einer weiteren tabelle und findest darueber raus welche id fuer deine suchabfrage relevant ist. dauert ein bischen laenger beim anlegen des indexes, aber alle suchabfragen sind dann deutlich schneller.
Code: Alles auswählen
AND MATCH(pt.post_subject, pt.post_text) AGAINST('+honda +civic' IN BOOLEAN MODE)
ORDER BY (MATCH(pt.post_subject) AGAINST('+honda +civic' IN BOOLEAN MODE)*2+MATCH(pt.post_text) AGAINST('+honda +civic' IN BOOLEAN MODE)) DESC
LIMIT 1000
Was meinst Du mit "lang"?bfs hat geschrieben:Na du musst einfach nur bedenken, das inndob an JEDEN Index immer als letzten Wert den PK anhängt. Deswegen solltest du bei InnoDB auch lange PK's vermeiden, weil sie deine Indizes aufblähen.
na und? dazu machst du einen index auf das suchwort. selbst bei 16.8 millionen zeilen brauchst du damit im schlimmsten falle nur 24 zugriffe um jeden beliebigen wert zu finden. eventuell kanns auch schneller sein nur die ersten 3, 4 oder 5 zeichen jedes wortes zu indizieren.mgutt hat geschrieben: Bei 1 Millionen Beiträgen mit je 20 Wörtern hat man schon ca. 10 Millionen Zeilen im word table. Die müssen erstmal durchsucht werden.
Für so einen Wort-Index würde ich einen Keyword-Tree implementieren. Wundert mich eigentlich, dass ein Fulltext-Index von Mysql nicht so aufgebaut ist.nerd hat geschrieben:na und? dazu machst du einen index auf das suchwort. selbst bei 16.8 millionen zeilen brauchst du damit im schlimmsten falle nur 24 zugriffe um jeden beliebigen wert zu finden. eventuell kanns auch schneller sein nur die ersten 3, 4 oder 5 zeichen jedes wortes zu indizieren.mgutt hat geschrieben: Bei 1 Millionen Beiträgen mit je 20 Wörtern hat man schon ca. 10 Millionen Zeilen im word table. Die müssen erstmal durchsucht werden.
die stopwoerter wuerde ich nicht mit in die tabelle aufnehmen, das spart auch ne menge platz.
Das mit der Limitierung der Indexlänge habe ich auch ausprobiert. Das bringt kaum was im Vergleich. Und am Ende steht trotzdem noch das Hinzufügen der Daten. Und wehe jemand sendet mal einen langen Text.nerd hat geschrieben:na und? dazu machst du einen index auf das suchwort. selbst bei 16.8 millionen zeilen brauchst du damit im schlimmsten falle nur 24 zugriffe um jeden beliebigen wert zu finden. eventuell kanns auch schneller sein nur die ersten 3, 4 oder 5 zeichen jedes wortes zu indizieren.mgutt hat geschrieben: Bei 1 Millionen Beiträgen mit je 20 Wörtern hat man schon ca. 10 Millionen Zeilen im word table. Die müssen erstmal durchsucht werden.
die stopwoerter wuerde ich nicht mit in die tabelle aufnehmen, das spart auch ne menge platz.