MySQL legge / scrive per tabella


8

Sto ottimizzando il nostro DB. In sostanza sto cercando di trovare le tabelle più scritte e più lette nel nostro db. Dopodiché seguirò il collegamento simbolico di tali tabelle in unità separate.

Esiste un modo per seguire ogni attività delle tabelle? Come nel seguire IOPS, scrive, legge per tabella?

Risposte:


10

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.logche 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 --filterparametro 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-digeste 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.


cache con batteria tampone - Potresti darmi qualche link per approfondire quelli?
Katafalkas,

en.wikipedia.org/wiki/RAID sarebbe un buon punto di partenza. RAID10 è generalmente superiore a RAID5 o 6 per i database.
Aaron Brown,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.