Metode 1
Jika Anda menggunakan Percona Server atau MariaDB (> = 5.2), Anda cukup mengatur variabel userstat / userstat_running untuk mengaktifkan sekelompok tabel INFORMATION_SCHEMA baru termasuk satu yang disebut TABLE_STATISTICS yang menyediakan informasi ini dengan tepat.
Sebagai contoh:
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 akan sesuai dengan tabel yang paling banyak ditulis dan ROWS_READ akan menjadi yang paling banyak dibaca. Anda juga harus melihat INDEX_STATISTICS untuk menemukan indeks Anda yang paling banyak digunakan.
Lihat juga dokumentasi statistik pengguna MariaDB .
Metode 2
Jika Anda tidak menggunakan Percona Server, Anda bisa menggunakan pt-query-digest untuk mengambil sampel pertanyaan Anda dan kemudian memfilter hanya INSERT / UPDATE / DELETEs. Itu akan terlihat seperti ini:
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;
Sekarang Anda memiliki file, /tmp/allqueries.log
yang berisi setiap permintaan yang dieksekusi di server Anda selama ~ 10 menit.
Selanjutnya, analisis dengan pt-query-digest untuk mendapatkan tabel yang paling sering ditulis:
pt-query-digest /tmp/allqueries.log --group-by=distill --filter '$event->{arg} =~ m/^(update|delete|insert)/i' --limit 5 > /tmp/writes.txt
Jika Anda memeriksa /tmp/writes.txt
, Anda akan melihat bagian di dekat bagian atas yang terlihat seperti ini:
# 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
Secara kasar, ini adalah tabel yang paling Anda tulis selama durasi sampel yang Anda pilih. Untuk mendapatkan hasil maksimal dari tabel (kira-kira), Anda dapat mengubah --filter
parameter --filter '$event->{arg} =~ m/^select/i'
dan Anda akan melihat output yang sama.
Jika Anda hanya tertarik pada penulisan, Anda dapat meneruskan log biner pt-query-digest
dan mendapatkan hasil yang serupa:
mysqlbinlog mysql-bin.000511 | pt-query-digest --type=binlog --group-by=distill > /tmp/writes.txt
Anda juga bisa mendapatkan data yang sama dengan tcpdump dan pt-query-digest --type=tcpdump
Jadi, ini dikatakan, dengan asumsi bahwa Anda menggunakan tabel InnoDB, saya sangat ragu bahwa Anda akan melihat banyak manfaat kinerja dari melakukan ini sama sekali. Karena cara data disangga ke log InnoDB dan kemudian ditulis ke disk, saya tidak akan berharap banyak atau keuntungan kinerja dari memindahkan tabel individual seperti ini. Anda mungkin melihat beberapa manfaat dari memindahkan file log InnoDB sendiri untuk memisahkan, disk lebih cepat untuk memisahkan log baca / tulis dari tablespace baca / tulis, tetapi bahkan itu dipertanyakan. Berinvestasi dalam array RAID yang cepat dan berkualitas tinggi dengan cache yang didukung baterai (atau lebih baik, SSD) akan lebih baik dalam menggunakan sumber daya Anda.