Web Artisan Blog - ウェブ アルチザン ブログ

MySQL:INSERT構文における便利なキーワード

SQL (37 items)

2007年02月01日

Research Artisan Pro ←リサーチアルチザンがパワーアップして復活しました!!
MySQLのINSERT構文には便利なキーワードがいくつかありますが、実際使ってみた以下2点についてのメモ。
ってか、マニュアルの”6.4.3. INSERT 構文”見りゃええっちゅー話ですが・・。


1、IGNORE

多くのレコードの INSERT でキーワード IGNORE が指定されていると、テーブルの既存の PRIMARY または UNIQUE キーと重複するレコードはすべて無視され、挿入されない。IGNORE が指定されていない場合に既存のキー値を重複して持つレコードがあると、挿入処理が中断される。



例えば、あるテーブルについて、データが無い場合のみINSERTしたいような場合、INSERT前にテーブルをSELECTしてデータの有無を確かめなくても、キーワード”IGNORE”を指定すれば、INSERT文一発で理想の動きをします。
INSERT IGNORE INTO tbl_name (col1,col2) VALUES(1,'a');

上記の場合で言うと、col1(col2でもいいけど)がPRIMARYかUNIQUEに指定される必要があります。。


2、DELAYED

キーワード DELAYED が指定されていると、サーバはレコードをバッファに挿入する。その後、INSERT DELAYED ステートメントを発行したクライアントは処理を続行することができる。テーブルが使用されていると、サーバはレコードを保持する。テーブルが解放されると、サーバはレコードの挿入を開始し、そのテーブルに対する新しい読み取り要求がないか定期的にチェックする。新しい読み取り要求があると、そのテーブルが再び解放されるまで、遅延されたレコードのキューの処理は中断される。


>6.4.3.2. INSERT DELAYED 構文

これは、主にログ記録用のテーブルにINSERTする場合とかに使いますかね。
INSERT DELAYED INTO tbl_name (col1,col2) VALUES(1,'a');


一方(シェルとか)の処理でログをどんどん記録しつつ、もう一方(画面とか)では、そのログをSELECTしにいくというような場合、双方の処理がぶつかって全体のパフォーマンスが落ちる事もあるんで、DELAYEDキーワードを使用すると、INSERT文発行時は、まずキューといった一旦別の場所にレコードが挿入されて、他からSELECTとかされていないようであれば、実際にテーブルに登録しにいくといった流れで登録されるものです。これであれば、一方(シェルとか)のINSERT処理が、もう一方(画面とか)からのSELECT処理によって一瞬待たされる(ロック)ような事も少なくなってきます。少なくなってくるというのは、このDELAYEDで待つスレッド数なんかは、以下のmy.cnfの設定によってきますので、マシン環境に合わせて適切に設定する必要があるでしょう。。
delayed_insert_limit
delayed_insert_timeout
delayed_queue_size
max_delayed_threads

※この設定については、以下のサイトが参考になります。
MySQLシステム変数

・・しかし、実際やってみて思いますが、下記マニュアルの注意書きのように本当に使う必要がある場合のみで、極力DELAYEDは使わない方がいいかもしれません。

注意: 対象のテーブルが使用中でない場合、INSERT DELAYED は通常の INSERT より遅くなります。また、INSERT DELAYED を使用する各テーブルに対応するスレッドを個別に処理するためにサーバで追加のオーバーヘッドが発生します。そのため、INSERT DELAYED はどうしても使う必要があるときのみ使用してください。


逆にパフォーマンス下げる可能性高いです。。。
前の記事 次の記事

Comments

コメントは、まだ書かれていません

Add Comments

Trackback

トラックバックはありません

Trackback URL

http://www.res-system.com/weblog/action.php?action=plugin&name=TrackBack&tb_id=620