epgrec:番組表取得の負荷を劇的に削減する方法

我が家はPT2でテレビを録画しているわけですが、番組表の取得時にPCに負荷がかかっているようです。非力なマシンのせいか、たまに録画に失敗するケースがあり、もしかするとそれが原因なのかもしれません。

番組表取得時にmysqlがCPUを異常に消費しており、調べてみるとDBのテーブルにインデックスが作成されていないせいではないかという気がしてきたのでインデックスを作成してみることにしました。

インデックス作成手順をメモしておきます。

まず、
mysql -u root -p
show databases;
use epgrec;
show tables;
で、テーブルを確認します。
+----------------------+
| Tables_in_epgrec     |
+----------------------+
| Recorder_categoryTbl |
| Recorder_channelTbl  |
| Recorder_keywordTbl  |
| Recorder_logTbl      |
| Recorder_programTbl  |
| Recorder_reserveTbl  |
| mt_autoscan          |
| mt_cds_active_item   |
| mt_cds_object        |
| mt_internal_setting  |
+----------------------+

いくつかテーブルがありますが、Indexが効くのはレコード数が多いテーブルでしょうから、
番組表が入っている、Recorder_programTblあたりが怪しいと踏みました。
予約テーブルのレコード数なんて数が知れていますからね。

次にepgrecのソースを見ていくとstoreProgram.inc.phpの中に
Where program_disc=,,,
と、Where句を指定している部分があったので、おそらくこの辺にインデックスを張ればいいのではないかと考えました。

show columns from Recorder_programTbl;
show index from Recorder_programTbl
で、カラムやインデックスを確認するとprogram_discにはインデックスが作成されていませんでした。

alter Recorder_programTbl add index idx_program_disc(program_disc);

でインデックスを追加しました。ついでに、その他のSQLで使われていそうなstarttimeやendtimeにもインデックスをつけておきました。(この辺が効いてるかどうかは怪しいところです。)

で、果たして効果はあったのか?

結果は大成功でした。
それまで、CPUを300%以上消費し、40分以上かかっていたの番組表の取得が、インデックス作成後は10分程度で終わるようになり、CPU使用率もほとんど上昇しなくなりました。

というわけで、番組表取得の処理が重くてお悩みの方はインデックスを作成してみることをお勧めします。

コメント

yshimo さんの投稿…
こちらのサイトを参考にepgrecのテーブルにインデックス作成したところ、番組表更新の負荷が劇的に下がりました。

情報、どうもありがとうございました。
haseshin さんの投稿…
コメントありがとうございます。
自分用のメモをかねて記事にしていたのですが、お役に立てて嬉しいです。