2017-04-23 3 views
-1

Ich versuche derzeit herauszufinden, warum die Site, an der ich arbeite (Laravel 4.2 Framework), wirklich langsam ist, und ich denke, dass es mit meiner Datenbankeinrichtung zu tun hat. Ich bin kein Profi überhaupt, also würde ich annehmen, dass, wo das Problem istLangsame MySQL-Tabelle

Meine sessions Tabelle hat etwa 2,2 Millionen Datensätze drin, wenn ich show processlist; ausführen, beziehen sich alle Abfragen, die am längsten dauern, auf diese Tabelle. Hier

ist ein Bild zum Beispiel:

enter image description here

Tabellenstruktur

enter image description here

Surerly ich tue etwas falsch oder es ist nicht richtig Index? Ich bin mir nicht sicher, nicht fantastisch mit Datenbanken.

+0

Ihre beste Wette ist es Datenbanksitzungen zu löschen und sie in etwas wie Redis zu speichern. Datenbanksitzungen sind einfach nicht für hohen Datenverkehr geeignet - Sie erhalten genau diese Art von Schreibkonflikten in der Sitzungstabelle. – ceejayoz

+1

Löschen Sie jemals diese Tabelle und entfernen Sie "tote" Sitzungen? –

Antwort

1

Das vollständige SQL wird nicht ausgeführt, daher können wir keine geeigneten Indizes empfehlen. Aber wenn das einzige Prädikat auf den DELETE-Anweisungen auf der last_activity Spalte d

DELETE FROM `sessions` WHERE last_activity <= 'somevalue' ; 

Dann Performance der DELETE-Anweisung wird wahrscheinlich durch Hinzufügen eines Index mit einer führenden Spalte von somevalue verbessert werden, zum Beispiel

CREATE INDEX sessions_IX1 ON sessions (last_activity); 

Wenn diese Tabelle MyISAM-Speichermodul verwendet, können DML-Anweisungen nicht gleichzeitig ausgeführt werden; DML-Anweisungen werden blockiert, während sie darauf warten, eine exklusive Sperre für die Tabelle zu erhalten. Die InnoDB-Speicher-Engine verwendet Sperren auf Zeilenebene, sodass einige DML-Vorgänge gleichzeitig ausgeführt werden können. (InnoDB nicht beseitigt Sperr-Konflikt, aber Sperren auf Zeilen und Indexblöcke sein, anstatt sich auf die gesamte Tabelle.)


Sehen Sie sich auch einen anderen Speichermechanismus (andere als MySQL-Datenbank) verwendet für die Speicherung und Abrufen von Informationen für Webserver-Sitzungen.

Ist es auch notwendig (besteht eine gewisse Anforderung), 2,2 Millionen "Sessions" -Reihen zu bestehen? Sind wir sicher, dass alle diese Zeilen tatsächlich benötigt werden? Wenn einige dieser Daten historisch sind und nicht speziell benötigt werden, um die aktuellen Webserver-Sitzungen zu unterstützen, könnten wir in Erwägung ziehen, die historischen Daten in eine andere Tabelle zu verschieben.