NP_Trackbackが重いといわれてしまったので、トラックバックが格納されているplugin_tbテーブルをちょっと調べてみたら、驚くべきことにまったくインデックスが張られていませんでした。
例えば、トップページなんかでTrackBack(nn)のようにエントリごとにトラックバックの件数表示なんかをやってしまったりすると、この数字一つ一つを計算するためにMySQLは一回一回テーブルをフルスキャンをするというなんとも恐ろしい状況になっていたわけです。これはトラックバックをたくさん抱えている人にとっては大変なサーバの負荷になります。
† ということでインデックスを張るには
おそらく単にインデックスを張ればすむ問題だと思うので、コンソールやphpMyAdminを通じてSQLが直に打てる場合には以下のクエリを実行することでこの状況を回避することができます。
インデックス作成SQL
ALTER TABLE `nucleus_plugin_tb` ADD INDEX `tb_id_block_timestamp_idx` ( `tb_id`, `block`, `timestamp` DESC );
† SQLを打つのが面倒な場合には、プラグインのバージョンアップで
これだけではあまりにも不親切なので、SQLが直に打てない人のためにフォーラムやうちのサイトで公開中のNP_Trackbackをバージョンアップしておきました。ファイル上書きの後、プラグインを一旦アンインストールし、再度インストールすることでインデックスの生成が行われるようになっています。NP_Trackback 2.01jpを使っている方にはバージョンアップを強くお勧めします。
† Indexを追加した結果
比較するまでもないですがインデックスの追加の前後で、MySQLの動きがどう変化したかについては下記のとおりです。読める人には一目瞭然ですが、テーブルの検索方法ががフルスキャンから、ちゃんとインデックスを使ったスキャンに変化しているのがお分かりいただけるかと思います。
詳しい読み方については「MySQL 4.1 リファレンスマニュアル :: 5.2.1 EXPLAIN 構文(SELECT に関する情報の取得)」、もしくは「実践ハイパフォーマンスMySQL
」の4章、5章あたりが参考になると思います。
Index追加前
mysql> explain select count(*) FROM nucleus_plugin_tb WHERE tb_id = 443 and block = 0 order by timestamp desc ;
+----+-------------+-------------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | nucleus_plugin_tb | ALL | NULL | NULL | NULL | NULL | 935 | Using where |
+----+-------------+-------------------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)
Index追加後
mysql> explain select count(*) FROM nucleus_plugin_tb WHERE tb_id = 443 and block = 0 order by timestamp desc ;
+----+-------------+-------------------+------+-----------------------+-----------------------+---------+-------------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------------+------+-----------------------+-----------------------+---------+-------------+------+--------------------------+
| 1 | SIMPLE | nucleus_plugin_tb | ref | tb_id_block_timestamp | tb_id_block_timestamp | 5 | const,const | 352 | Using where; Using index |
+----+-------------+-------------------+------+-----------------------+-----------------------+---------+-------------+------+--------------------------+
1 row in set (0.00 sec)