Methode 1
Wenn Sie Percona Server oder MariaDB (> = 5.2) verwenden, können Sie einfach die Variable userstat / userstat_running festlegen , um eine Reihe neuer INFORMATION_SCHEMA-Tabellen zu aktivieren, einschließlich einer mit dem Namen TABLE_STATISTICS, die genau diese Informationen enthält.
Zum Beispiel:
mysql> SELECT TABLE_NAME, ROWS_READ, ROWS_CHANGED, ROWS_CHANGED_X_INDEXES FROM TABLE_STATISTICS ORDER BY ROWS_CHANGED DESC LIMIT 5;
+-------------------+------------+--------------+------------------------+
| TABLE_NAME | ROWS_READ | ROWS_CHANGED | ROWS_CHANGED_X_INDEXES |
+-------------------+------------+--------------+------------------------+
| user | 21122527 | 5989231 | 23956924 |
| audit | 1208 | 5020929 | 20083716 |
| sometemp | 13995426 | 3182150 | 9546450 |
| creditcards | 3566482 | 2998976 | 11995904 |
| order | 2147483647 | 2662606 | 53252120 |
+-------------------+------------+--------------+------------------------+
ROWS_CHANGED würde dem am meisten in Tabellen geschriebenen entsprechen und ROWS_READ würde am meisten gelesen werden. Sie sollten sich auch INDEX_STATISTICS ansehen, um die am häufigsten und am wenigsten verwendeten Indizes zu finden.
Siehe auch die Dokumentation zur MariaDB-Benutzerstatistik .
Methode 2
Wenn Sie Percona Server nicht verwenden, können Sie mit pt-query-Digest ein Beispiel Ihrer Abfragen erfassen und dann nur INSERT / UPDATE / DELETEs herausfiltern. Das würde ungefähr so aussehen:
mysql> SELECT @@GLOBAL.slow_query_log_file;
+------------------------------------------+
| @@GLOBAL.slow_query_log_file |
+------------------------------------------+
| /var/logs/mysql/slowquery.log |
+------------------------------------------+
1 row in set (0.00 sec)
mysql> SET GLOBAL slow_query_log_file='/tmp/allqueries.log';
mysql> SELECT @@GLOBAL.long_query_time;
+--------------------------+
| @@GLOBAL.long_query_time |
+--------------------------+
| 0.250000 |
+--------------------------+
1 row in set (0.00 sec)
mysql> SET GLOBAL long_query_time = 0;
mysql> FLUSH LOGS;
mysql> SLEEP 600; SET GLOBAL long_query_time = 0.25; SET GLOBAL slow_query_log_file='/var/logs/mysql/slowquery.log'; FLUSH LOGS;
Jetzt haben Sie eine Datei, /tmp/allqueries.log
die jede auf Ihrem Server ausgeführte Abfrage für ca. 10 Minuten enthält.
Analysieren Sie es anschließend mit pt-query-Digest, um das am häufigsten in Tabellen geschriebene zu erhalten:
pt-query-digest /tmp/allqueries.log --group-by=distill --filter '$event->{arg} =~ m/^(update|delete|insert)/i' --limit 5 > /tmp/writes.txt
Wenn Sie dies untersuchen /tmp/writes.txt
, sehen Sie oben einen Abschnitt, der folgendermaßen aussieht:
# Profile
# Rank Query ID Response time Calls R/Call Apdx V/M Item
# ==== ======== ============= ===== ====== ==== ===== ====================
# 1 0x 0.0558 26.8% 282 0.0002 1.00 0.00 INSERT UPDATE user
# 2 0x 0.0448 21.5% 246 0.0002 1.00 0.00 UPDATE audit
# 3 0x 0.0228 10.9% 11 0.0021 1.00 0.00 UPDATE sometemp
# 4 0x 0.0108 5.2% 16 0.0007 1.00 0.00 UPDATE creditcards
# 5 0x 0.0103 4.9% 43 0.0002 1.00 0.00 UPDATE order
Dies sind ungefähr die am häufigsten in Tabellen geschriebenen Tabellen für die Dauer der von Ihnen ausgewählten Stichprobe. Um die Tabellen (ungefähr) --filter
optimal zu lesen, können Sie den Parameter in ändern --filter '$event->{arg} =~ m/^select/i'
und sehen eine ähnliche Ausgabe.
Wenn Sie nur an Schreibvorgängen interessiert sind, können Sie ein binäres Log übergeben pt-query-digest
und ähnliche Ergebnisse erzielen:
mysqlbinlog mysql-bin.000511 | pt-query-digest --type=binlog --group-by=distill > /tmp/writes.txt
Sie können dieselben Daten auch mit tcpdump und abrufen pt-query-digest --type=tcpdump
Unter der Annahme, dass Sie InnoDB-Tabellen verwenden, bezweifle ich sehr, dass Sie dadurch einen großen Leistungsvorteil erzielen. Aufgrund der Art und Weise, wie Daten in das InnoDB-Protokoll gepuffert und dann auf die Festplatte geschrieben werden, würde ich nicht viel oder keinen Leistungsgewinn erwarten, wenn einzelne Tabellen so verschoben werden. Möglicherweise sehen Sie einen gewissen Vorteil darin, die InnoDB-Protokolldateien selbst auf eine separate, schnellere Festplatte zu verschieben, um das Lesen / Schreiben des Protokolls vom Lesen / Schreiben des Tabellenbereichs zu trennen, aber selbst das ist fraglich. Wenn Sie in schnelle, qualitativ hochwertige RAID-Arrays mit einem batteriegepufferten Cache (oder besser SSD) investieren, können Sie Ihre Ressourcen besser nutzen.