MAGAZINE

ルーターマガジン

インフラ/運用

MySQL/MariaDBで未使用のテーブルを効率的に見つける方法

2025.04.17
Pocket

今回はMySQL(MariaDB)環境で不要なテーブルを見つける方法をご紹介します。

Performance Schemaをオンにする

まずMySQLのPerformance Schemaを有効にします。若干パフォーマンスが下がるらしいのですが、16CPU、128GBのサーバー環境では、そこまでパフォーマンスはさがりませんでした。

  1. デフォルト状態の確認: 以下のコマンドで現在のPerformance Schemaの状態を確認します。
SHOW VARIABLES LIKE 'performance_schema';

結果がONの場合は有効、OFFの場合は無効です。 OFFの場合は下の手順でONにしましょう

  1. my.cnfファイルの設定: サーバーの設定ファイル(通常はmy.cnfまたはmy.ini)に以下の行を追加します。
[mysqld]
performance_schema=ON

この設定を保存し、MySQLサーバーを再起動します。

  1. コンソールからの設定(クラウド環境の場合): クラウドサービス(例: ApsaraDB RDSやPolarDB)の場合、管理コンソールからパラメータ設定ページでperformance_schemaを検索し、値をONに変更します。

Performance Schemaを使って使用していないテーブルを特定する方法

Performance Schemaを利用して使用されていないテーブルを特定するには、以下の手順を実行します。

手順

Performance SchemaではテーブルごとのI/O統計情報が収集されています。以下のクエリで各テーブルの使用状況を確認できます。

SELECT 
OBJECT_SCHEMA, OBJECT_NAME, COUNT_STAR, COUNT_READ, COUNT_WRITE
FROM performance_schema.table_io_waits_summary_by_table
order by COUNT_STAR;

+--------------------+-------------------------------------------+------------+------------+-------------+
| OBJECT_SCHEMA      | OBJECT_NAME                               | COUNT_STAR | COUNT_READ | COUNT_WRITE |
+--------------------+-------------------------------------------+------------+------------+-------------+
| mysql              | plugin                                    |          0 |          0 |           0 |
| mysql              | func                                      |          0 |          0 |           0 |
| mysql              | event                                     |          0 |          0 |           0 |
| mysql              | proc                                      |          0 |          0 |           0 |
| mysql              | table_stats                               |          0 |          0 |           0 |
| mysql              | column_stats                              |          0 |          0 |           0 |
| mysql              | index_stats                               |          0 |          0 |           0 |
| mysql              | procs_priv                                |          0 |          0 |           0 |
| mysql              | columns_priv                              |          0 |          0 |           0 |
| mysql              | gtid_slave_pos                            |          0 |          0 |           0 |
| mysql              | servers                                   |          0 |          0 |           0 |
| mysql              | db                                        |          0 |          0 |           0 |
| mysql              | proxies_priv                              |          0 |          0 |           0 |
| mysql              | roles_mapping                             |          0 |          0 |           0 |
| mysql              | global_priv                               |          0 |          0 |           0 |
| mysql              | time_zone_leap_second                     |          0 |          0 |           0 |
| mysql              | tables_priv                               |          0 |          0 |           0 |
| mysql              | innodb_index_stats                        |          0 |          0 |           0 |
| mysql              | time_zone_transition                      |          0 |          0 |           0 |
| mysql              | time_zone_transition_type                 |          0 |          0 |           0 |
| mysql              | time_zone                                 |          0 |          0 |           0 |
| mysql              | time_zone_name                            |          0 |          0 |           0 |
| database           | table1                                    |          3 |          3 |           0 |
| database           | table2                                    |       1737 |          0 |         860 |
+--------------------+-------------------------------------------+------------+------------+-------------+
- COUNT_READ: テーブルが読み取られた回数。
- COUNT_WRITE: テーブルに書き込まれた回数。
- COUNT_STAR:COUNT_READ、COUNT_WRITEの合計。

このクエリは、サーバー起動後のすべてのテーブルの、テーブルへの読み込みレコード数、書き込みレコード数の合計が少ない順にリストアップします。 上にきているテーブルほど、参照、更新回数が少ないテーブル、つまり使われていないテーブルということです。 更新はされているけど参照されていないテーブルもあったりするので、COUNT_READが0のテーブルは本当に必要か確認したほうがよいかもしれません。

Pocket

CONTACT

お問い合わせ・ご依頼はこちらから