MySQL liest / schreibt pro Tabelle

8

Ich optimiere unsere DB. Im Wesentlichen versuche ich, die am meisten geschriebenen und am meisten gelesenen Tabellen in unserer Datenbank zu finden. Danach werde ich diese Tabellen in separate Laufwerke einbinden.

Gibt es eine Möglichkeit, die Aktivitäten der einzelnen Tabellen zu verfolgen? Wie in IOPS folgen, schreibt, liest pro Tabelle?

Katafalkas
quelle

Antworten:

10

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.logdie 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) --filteroptimal 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-digestund ä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.

Aaron Brown
quelle
batteriegepufferter Cache - Können Sie mir einen Link geben, um diese näher zu untersuchen?
Katafalkas
en.wikipedia.org/wiki/RAID wäre ein guter Anfang. RAID10 ist RAID5 oder 6 für Datenbanken im Allgemeinen überlegen.
Aaron Brown