Metodo 1
Se stai usando Percona Server o MariaDB (> = 5.2), puoi semplicemente impostare la variabile userstat / userstat_running per abilitare un sacco di nuove tabelle INFORMATION_SCHEMA, inclusa una chiamata TABLE_STATISTICS che fornisce esattamente queste informazioni.
Per esempio:
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 corrisponderebbe al più scritto nelle tabelle e ROWS_READ sarebbe il più letto. Dovresti anche consultare INDEX_STATISTICS per trovare gli indici più e meno utilizzati.
Vedi anche la documentazione delle statistiche utente di MariaDB .
Metodo 2
Se non si utilizza Percona Server, è possibile utilizzare pt-query-digest per acquisire un campione delle query e quindi filtrare solo INSERT / UPDATE / DELETEs. Sarebbe simile a questo:
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;
Ora hai un file /tmp/allqueries.log
che contiene ogni query eseguita sul tuo server per ~ 10 minuti.
Successivamente, analizzalo con pt-query-digest per ottenere il più frequentemente scritto nelle tabelle:
pt-query-digest /tmp/allqueries.log --group-by=distill --filter '$event->{arg} =~ m/^(update|delete|insert)/i' --limit 5 > /tmp/writes.txt
Se esamini /tmp/writes.txt
, vedrai una sezione nella parte superiore che assomiglia a questa:
# 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
All'incirca, questi sono i più scritti nelle tabelle per la durata del campione che hai scelto. Per ottenere il massimo dalle tabelle (approssimativamente), è possibile modificare il --filter
parametro in --filter '$event->{arg} =~ m/^select/i'
e visualizzerà un output simile.
Se sei interessato solo alle scritture, puoi passare un log binario pt-query-digest
e ottenere risultati simili:
mysqlbinlog mysql-bin.000511 | pt-query-digest --type=binlog --group-by=distill > /tmp/writes.txt
Puoi anche ottenere gli stessi dati con tcpdump e pt-query-digest --type=tcpdump
Quindi, detto questo, supponendo che tu stia utilizzando le tabelle InnoDB, dubito fortemente che vedrai molti benefici in termini di prestazioni. A causa del modo in cui i dati vengono bufferizzati nel registro InnoDB e quindi scritti su disco, non mi aspetterei molto o alcun vantaggio in termini di prestazioni spostando le singole tabelle in questo modo. Si potrebbe vedere qualche beneficio da spostare i file di log InnoDB se stessi per separare, più veloce del disco per separare il registro di lettura / scrive dal tablespace lettura / scrittura, ma anche questo è discutibile. Investire in array RAID veloci e di alta qualità con una cache alimentata a batteria (o meglio, SSD) sarà un migliore utilizzo delle risorse.