Wenn ich Sie wäre, würde ich alle Daten auf InnoDB umstellen. Das Sperren von Tabellen / Zeilen wird von vielen schon lange diskutiert. Ich würde InnoDB immer zweifellos wählen. Es gibt jedoch noch einen weiteren wichtigen Grund, sich für InnoDB zu entscheiden ... CACHING .
Während die meisten Leute damit prahlen, dass MyISAM schneller zum Lesen ist, vergessen die meisten Leute, dass der viele Cache für MyISAM, der als Schlüsselcache bezeichnet wird (festgelegt durch key_buffer_size), nur Indexseiten aus .MYI-Dateien zwischenspeichert. Es werden niemals Datenseiten zwischengespeichert. Es hat ein offizielles Maximum von 4 GB in 32-Bit-Systemen. 8 GB sind das beste Maximum für 64-Bit.
Der InnoDB-Pufferpool speichert die Daten- und Indexseiten zwischen. Abhängig von Ihrem Server können Sie bis zu dem gesamten Datensatz im RAM zwischenspeichern. Sie können InnoDB für bis zu 80% RAM und 10% für DB Conenctions optimieren und 10% für das Betriebssystem belassen. Dies gilt auch für verschiedene Betriebssysteme .
Ich habe diese Dinge Drupal-Kunden mit erstaunlichem Erfolg empfohlen . Dies gilt auch für Wordpress . Ich habe DB-Unterstützung für Clients mit WordPress bereitgestellt. Gleiche Verbesserungen.
Sie können den Speicher für InnoDB immer effektiver konfigurieren als für MyISAM. Es gibt immer eine Möglichkeit, InnoDB zu tweeken, um Ihren Leistungsanforderungen zu entsprechen . Wenn Ihre Daten wachsen, werden sie schließlich zu einer Anforderung .
UPDATE 2011-11-21 11:44 EST
Wenn Ihr vollständiger Datensatz klein genug ist, können Sie direkt nach dem Start von mysql eine SELECT-Abfrage für jede Tabelle ausführen.
Führen Sie für alle Tabellen, die InnoDB und / oder MyISAM sind, diese Abfrage aus:
SELECT DISTINCT
CONCAT('SELECT ',ndxcollist,' FROM ',
db,'.',tb,' ORDER BY ',ndxcollist,';') SelectQueryToLoadCache
FROM (
SELECT
engine,table_schema db,table_name tb,index_name,
GROUP_CONCAT(column_name ORDER BY seq_in_index) ndxcollist
FROM (
SELECT
B.engine,A.table_schema,A.table_name,
A.index_name,A.column_name,A.seq_in_index
FROM
information_schema.statistics A INNER JOIN
(SELECT engine,table_schema,table_name
FROM information_schema.tables
WHERE engine IN ('InnoDB','MyISAM')) B
USING (table_schema,table_name)
WHERE
B.table_schema NOT IN ('information_schema','mysql')
AND A.index_type <> 'FULLTEXT'
ORDER BY
table_schema,table_name,index_name,seq_in_index
) A
GROUP BY
table_schema,table_name,index_name
) AA
ORDER BY
engine DESC,db,tb
;
Dadurch wird jede mögliche SELECT-Abfrage ausgegeben, die Sie ausführen müssen, um alle zu referenzierenden Indizes aufzurufen. Platzieren Sie diese Abfrage in einer Datei mit dem Namen /root/MakeSelectQueriesToLoad.sql. Führen Sie das Skript aus und sammeln Sie die Ausgabe /root/SelectQueriesToLoad.sql. Führen Sie es schließlich aus:
mysql -u... -p... -AN < /root/MakeSelectQueriesToLoad.sql > /root/SelectQueriesToLoad.sql
mysql -u... -p... < /root/SelectQueriesToLoad.sql
Dadurch werden definitiv alle Indexseiten in den InnoDB-Pufferpool und den MyISAM-Schlüsselcache vorgeladen. Wenn alle Ihre Daten InnoDB sind, nehmen Sie zwei Änderungen vor:
- ersetzen
WHERE engine IN ('InnoDB','MyISAM')
durchWHERE engine='InnoDB'
- ersetzen
CONCAT('SELECT ',ndxcollist,' FROM ',
durchCONCAT('SELECT * FROM ',
Dadurch werden auch mehr Datenseiten in den InnoDB-Pufferpool eingefügt.
SCHLUSSBEMERKUNG: Stellen Sie sicher, dass der InnoDB-Pufferpool groß genug ist, um alle Ihre InnoDB-Daten aufzunehmen