MySQL membaca / menulis per tabel

8

Saya mengoptimalkan DB kami. Pada dasarnya saya mencoba mencari tabel yang paling banyak ditulis dan paling banyak dibaca di db kami. Setelah itu saya akan mengikuti dengan menghubungkan tabel-tabel tersebut ke drive yang terpisah.

Apakah ada cara mengikuti setiap aktivitas tabel? Seperti dalam mengikuti IOPS, menulis, membaca per tabel?

Katafalkas
sumber

Jawaban:

10

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.logyang 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 --filterparameter --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-digestdan 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.

Aaron Brown
sumber
cache yang didukung baterai - Bisakah Anda memberi saya tautan untuk melihat lebih jauh ke dalamnya?
Katafalkas
en.wikipedia.org/wiki/RAID akan menjadi tempat yang baik untuk memulai. RAID10 umumnya lebih unggul dari RAID5 atau 6 untuk database.
Aaron Brown