最近 RDBMS のトリガーを色々書いているのですが、知らない人にトリガーが何かいちいち説明するのに簡単な例はないかな、というのと、MySQL の処理速度はトリガーによってどの程度変化するか、ということを確認するために、以下のような実験を行ってみました。
InnoDB はしばしば、「SELECT COUNT(*) が遅い!」と批判されます。では、トリガーを使って行数を別のテーブルにキャッシュすればいいのではないでしょうか? 以下のように、極めて小さなテーブル t1 を作り、その行数を t1_cnt にキャッシュしてみることにします。
mysql> create table t1 (
-> id int unsigned not null primary key auto_increment,
-> v int unsigned not null
-> ) engine=innodb;
Query OK, 0 rows affected (0.01 sec)
mysql> create table t1_cnt (
-> cnt int unsigned not null
-> ) engine=innodb;
Query OK, 0 rows affected (0.01 sec)
mysql> insert into t1_cnt values (0);
Query OK, 1 row affected (0.00 sec)
テーブルを定義し、t1_cnt に行数の初期値 (0) をセットしたら、次にトリガーを登録します。
mysql> delimiter |
mysql> create trigger t1_insert after insert on t1 for each row begin
-> update t1_cnt set cnt=cnt+1;
-> end|
Query OK, 0 rows affected (0.01 sec)
mysql> create trigger t1_delete after delete on t1 for each row begin
-> update t1_cnt set cnt=cnt-1;
-> end|
Query OK, 0 rows affected (0.01 sec)
mysql> delimiter ;
試しに t1 テーブルに値を出し入れして、t1_cnt の行数が変化することを確認します。