Drupal Datenbank innodb oder MyISAM?

10

Ich habe eine Drupal-Site und leide unter Leistungsproblemen. Ich habe festgestellt, wie ich eine Datenbank von MyISAM nach InnoDB konvertiere. Dies zeigt an, dass sich die Leistung durch Umschalten verbessern kann.

Wie kann ich feststellen, ob meine MySQL-Datenbank InnoDB oder MyISAM ist?

Chrisjlee
quelle
1
Der Tabellentyp ist nicht an den Katalog gebunden. Sie können einen Katalog mit einer Mischung aus MyISAM- und InnoDB-Tabellen haben.
mpdonadio
2
Optimierungen auf dieser Ebene bieten zwar Vorteile, ich bezweifle jedoch, dass das Ändern von Tabellentypen Ihre Leistungsprobleme beheben wird. Der Unterschied ist einfach nicht so groß.
Letharion
1
@ Chris J. Lee, das ist richtig. Das Mischen von Tabellentypen kann aus Leistungsgründen oder zum Ausnutzen von Funktionen verwendet werden, die nur für einen bestimmten Tabellentyp verfügbar sind (z. B. FULLTEXT-Suche mit MyISAM-Tabellen). Es kann auch versehentlich passieren, wenn Sie die Standardeinstellungen von mysqld ändern und weitere Tabellen in einem Katalog erstellen :)
mpdonadio
2
Letharion: Das ist einfach falsch. Tabellentypen und die Art und Weise, wie MySQL für sie konfiguriert ist, haben einen großen Einfluss auf die Leistung!
Walter Heck
2
@Letharion: Abgesehen von Architekturverbesserungen bedeuten sehr große Leistungssteigerungen bei Parallelität mit gemischten SELECTs und UPDATEs - ein UPDATE sperrt eine Tabelle in MyISAM, aber nur eine Zeile in InnoDB -, dass enorme Leistungssteigerungen möglich sind mit nichts weiter gesehen werden, als den Motor eines Tisches zu wechseln. Wenn Sie jetzt eine dumme Abfrage durchführen, führen Sie eine dumme Abfrage durch, und das Ändern der Tabellentypen hilft nicht weiter. Aber es ist ebenso falsch, wechselnde Motoren außer Kontrolle zu bringen.
BMDan

Antworten:

8

Sie können eine benutzerdefinierte Abfrage ausführen:

SELECT TABLE_NAME, ENGINE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'database_name'

um alle Tabellen in Ihrer Datenbank und die jeweils verwendete Engine aufzulisten.

Alternativ können Sie sich mit phpMyAdmin bei Ihrer Datenbank anmelden und Ihre Datenbank auswählen. Die Engine wird in der TypeSpalte in der Liste der Tabellen angezeigt.

Persönlich würde ich Navicat für MySQL empfehlen , es ist eine sehr schöne MySQL-GUI und macht es sehr einfach, solche Dinge herauszufinden.

Quelle: http://www.electrictoolbox.com/mysql-table-storage-engine/

Clive
quelle
Das alte MySQL Administrator-Tool funktioniert auch für solche Dinge gut. Wenn Sie auf der MySQL-Website stöbern, finden Sie immer noch das Installationsprogramm.
mpdonadio
@MPD Wow geht das noch? Muss das herunterladen, auch wenn nur für ein bisschen Nostalgie :)
Clive
Administrator und Abfragebrowser sind jetzt offiziell veraltet und werden nicht mehr unterstützt. Sie können sie jedoch weiterhin herunterladen. Ich hasse Workbench und benutze diese immer noch.
mpdonadio
Verwenden Sie, um eine ähnliche Ausgabe wie in phpMyAdmin in der Befehlszeile anzuzeigen SHOW TABLE STATUS. Um eine einfache Zählung der Anzahl der Tabellen in jedem Motortyp zu erhalten, ist dies der Fall SELECT ENGINE,COUNT(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA='database_name' GROUP BY ENGINE.
BMDan
7

Nur Dinge auszuprobieren, um eine Website schneller zu machen, ist wie blindlings Autos zu wechseln und zu hoffen, dass Sie beim nächsten Mal eine schnellere bekommen.

Versuchen Sie zuerst die niedrig hängenden Früchte. Wenn es nicht hilft, versuchen Sie, den wirklichen Engpass zu finden.

  1. Haben Sie die integrierten Mechanismen aktiviert: Seiten-Caching (nur für anonyme Benutzer wirksam), CSS- und JS-Agregation?
  2. Wenn Ihr Host einen Opcode-Cache wie APC anbietet, aktivieren Sie ihn.
  3. Richten Sie Ihr Drupal-Gebietsschema ein, einschließlich der vollständigen Datenbank.
  4. Stellen Sie sicher, dass XDebug ausgeführt wird.
  5. Beginnen Sie mit der Erstellung echter Leistungsprofile. Auf diese Weise können Sie feststellen, welcher Teil Ihrer Website viel Zeit in Anspruch nimmt. Je langsamer Ihre Website ist, desto einfacher ist es, den schuldigen Code / die schuldige Komponente zu finden.

Oft ist es nur eine langsame DB-Abfrage, die einen Index benötigt, oder ein Modul, das Dinge langsam erledigt.

Ich habe auch große Unterschiede zwischen Hostern entdeckt. Wenn Sie ein neues Drupal sofort installieren, ist die Leistung in Ordnung? Wenn nicht, ist es Zeit, nach einem anderen Hoster zu suchen.

BetaRide
quelle
6

Meine beste Erfahrung war es, pro Tisch zu entscheiden. InnoDB ist nett, weil es das Sperren von Tabellen vermeiden kann (kein anderer Prozess kann aus einer Tabelle lesen, während ein Prozess schreibt), aber es funktioniert schrecklich mit COUNT (), das häufig für Pager-Abfragen verwendet wird.

(Bearbeiten: siehe Clives Kommentar unten)

Es gibt auch Auswirkungen auf Ihr MySQL-Setup, je nachdem, welche Datenbank Sie verwenden. Wenn Sie Zugriff auf den Server haben, sollte mysqltuner Ihr erster Schritt sein, um die Konfiguration zu überprüfen:

https://github.com/rackerhacker/MySQLTuner-perl#readme

Martin
quelle
2
1 Ich wusste nicht , InnoDB für langsam war COUNTAbfragen nach diesem Artikel von der ehemaligen High - Performance Group Manager für MySQL , obwohl es eigentlich nur eine Abfrage enthält , wirkt sich COUNT(*) ohne eine WHEREKlausel.
Clive
3
Der Grund dafür ist, dass MyISAM einen Wert pro Tabelle für die Anzahl der Zeilen in der Tabelle verwaltet, was bedeutet, dass ein einfacher SELECT COUNT(*) FROM tableBenutzer mit diesem Wert sofort zurückkehren kann. InnoDB tut dies nicht, daher muss der gesamte Primärschlüsselindex gescannt werden. Das heißt, während Drupal viel tut SELECT COUNT(*), kann ich mir nur eine Stelle im gesamten Code vorstellen, die dies ohne WHEREKlausel tut . Verwenden Sie MyISAM daher nicht aus Sorge um diesen speziellen Randfall. InnoDB mit einem Pufferpool mit anständiger Größe ist für alle realen Abfragen schneller.
BMDan
5

FWIW auf unserer Drupal 6.x-Site mit fast 20.000 Knoten traten einige Leistungsprobleme auf, und ich entschied mich dafür, alle Tabellen in InnoDB zu verschieben. Es war einfach und die Art und Weise, wie ich damit umging, bestand darin, mit mysqldump den gesamten Inhalt in eine SQL-Datei zu kopieren, einen Editor (sed) zu verwenden, um alle Vorkommen von MyISAM in InnoDB zu ersetzen, und dann die Datenbank aus dieser Datei neu zu laden. Einer der Nachteile ist, dass Sie keinen Speicherplatz aus einer InnoDB-Datenbank (IIRC) wiederherstellen können. Solange Sie Ihre doppelten Tabellen in einer separaten Datenbank aufbewahren, sollten Sie keine Probleme haben. Oh, und wir haben eine signifikante Leistungssteigerung gesehen. Und weil wir vier Drupal-Instanzen haben, wurde die schiere Anzahl von Tabellendateien aus dem Dateisystem entfernt (ja, sie sind in der InnoDB-Datei selbst enthalten). Das ist mein Wert von 0,02 $.

Bobmct
quelle
2
Wenn Sie nur einen InnoDB-Tabellenbereich haben, können Sie Inodes sparen, jedoch (wie Sie selbst erwähnen) auf Kosten des Speicherplatzes. Selbst wenn Sie viele Daten löschen, können Sie diesen Speicherplatz nicht zurückfordern. Dies führt auch zu unnötig großen Sicherungsdateien und dazu, dass einzelne Tabellen nicht wiederhergestellt werden können. Deshalb bevorzuge ich die innodb_file_per_tableOption.
Geewiz
1
Sie können Tabellen auch direkt konvertieren : for tbl in $(mysql -Ne 'show tables' databasename); do mysql -e "ALTER TABLE $tbl ENGINE=InnoDB"; done. Fügen Sie -uroot -psomepassden beiden Optionen mysqlbei Bedarf geeignete Optionen ( z. B.) hinzu .
BMDan
5

Nur ein Kopf hoch. Wenn Sie Drupal 6 verwenden, können Sie das DBTuner- Modul installieren . Es kann Ihre Tabellen leicht von MyISAM nach InnoDB verschieben. Also ja, dafür gibt es ein Modul!

mikeytown2
quelle