Movable Typeに「おっぱい問題」はある?

先日行われたWordCamp Tokyo 2013のテクニカルセッションで、宮内さんから「WordPressにプラグインをたくさんインストールすると、wp_optionsテーブルが肥大化して、WordPressの動作が重くなる場合がある」という話がありました。
その後、このことについて記事がまとめられていて、この件に「おっぱい問題」(プションがいっぱいになる)という名前が付けられてました(笑)。

では、Movable Typeには「おっぱい問題」は存在するのでしょうか?
この点を調べてみました。

1.「おっぱい問題」の概要

「おっぱい問題」は、以下の2点から構成されます。

1-1.情報の先読みによる問題

WordPressでは、コアの設定やプラグインの設定などの情報を、「wp_options」というテーブルに保存しています。
そして、このテーブルの情報が必要になった時には、個々の情報を1つずつ読むのではなく、各種の情報を一気に先読みするようになっています。
1つずつ設定を読むと、SQLの実行回数が多くなって処理が重くなるので、1回のSQLでまとめて読み込むという考え方です。

ただ、大量のプラグインをインストールすると、wp_optionsテーブルに多数の情報が保存されていくので、データの読み込みが重くなっていきます。
これが、WordPressが重くなる1つの原因になります。

1-2.プラグインをアンインストールしても設定が削除されない問題

前述したように、プラグインをインストールして利用すると、そのプラグインの情報がwp_optionsテーブルに保存されます。
となると、プラグインをアンインストールしたときには、不要になった情報をwp_optionsテーブルから削除すべきです。

プラグインをアンインストールする際に、何らかの処理を行うことができます(register uninstall hook関数)。
アンインストールのタイミングで、wp_optionsテーブルから情報を削除することは可能です。
ただ、そのような処理を行っているプラグインは少ないとのことです。
そのため、プラグインを削除すると、wp_optionsテーブルにゴミ情報が残ることが多いです。

また、wp_optionsテーブルには、「個々の情報を保存したのが誰(どのプラグイン)か」ということを表すフィールドがありません。
このフィールドがあれば、SQLで「○○プラグインが保存した情報を一括削除」というような処理ができます。
しかし、このフィールドがないので、ゴミ情報を削除するのが非常に困難になります。
プラグインをアンインストールした後でゴミ情報を削除するには、そのプラグインのソースコードを丹念に調べることが必要になります。

2.Movable Typeでは?

上記の2つの問題について、Movable Typeがどのような仕組みを取っているかをまとめます。

2-1.先読みはしない

Movable Typeでは、たいていのプラグインの情報は、「mt_plugindata」というテーブルに保存されます。
Movable Typeのソースコードをざっと見た感じでは、プラグインの設定をまとめて先読みすることは行っていませんでした。
情報が必要になった時点で、その都度読み込む形です。

そのため、先読みと比べると、情報を1つひとつ読み込むため、プラグインが多くなると、情報の読み込みに時間がかかりやすくなります。
ただ、WordPressと比べて、Movable Typeはプラグインに依存する度合いがそれほど高くありません。
先読みする方が速いかどうかは、微妙な感じがします。

また、Movable Typeでは基本的に静的にページを出力します。
プラグインを多数インストールすれば、管理画面は重くなりますが、静的生成で公開しているサイトには影響は及びません。

2-2.SQLで情報を削除できる

Movable Typeには、管理画面上でプラグインをアンインストールする機能はありません。
プラグインのファイルを手動で削除するだけです。
そのため、プラグインをアンインストールすると、mt_plugindataテーブルにごみが残ることになります。

ただ、mt_plugindataテーブルには、プラグイン名を表すフィールドがあります(plugindata_pluginフィールド)。
ここから、情報を保存したプラグインを割り出すことができ、以下のSQLでまとめて情報を削除することができます。
「プラグインのID」はプラグインの名前とおおむね等しいので、phpMyAdminでテーブルを確認すれば、プラグインのIDはほぼ分かります。

delete from mt_plugindata
where plugindata_plugin = 'プラグインのID'