[groonga-dev,01377] Re: mroongaストレージモードでのオートインクリメントについて

Back to archive index

kentoku kento****@gmail*****
2013年 5月 8日 (水) 23:32:47 JST


斯波です。

MySQLのオートインクリメントの挙動は、全ストレージエンジンで共通という訳ではなく、
MyISAMの場合は、田辺さんの求める挙動になるのですが、
InnoDBの場合は、インスタンスを再起動すると起動後最初にオートインクリメント値が
必要になったタイミングで、その時の最大値をもとに採番されるため、
過去に削除された値が再度払いだされることがあり得ます。

こちらの回避策ですが、mroongaの場合はラッパーモードをサポートしておりますので、
MyISAMのテーブルをラップして利用して頂くか、
MySQLのリファレンスマニュアルに紹介されているシークエンスのシミュレーションの手法で
払いだした番号を別テーブルで管理するという方式があります。
http://dev.mysql.com/doc/refman/5.1/ja/information-functions.html
(のLAST_INSERT_IDのところ)

こちらではいかがでしょうか?

どうぞ、よろしくお願いします。




2013年5月7日 4:25 <mail_babir****@yahoo*****>:

> 田辺です。
>
> 表題の件についてですが、オートインクリメントについて、他のストレージエンジンと異なる動作がありましたので、ご連絡させて頂きます。
>
> 以下再現コードです。
> -----------------------
> CREATE TABLE `test` (
>   `id` int(11) NOT NULL AUTO_INCREMENT,
>   `main` varchar(255) NOT NULL COLLATE 'utf8_unicode_ci',
>   PRIMARY KEY (`id`)
> ) ENGINE=innodb DEFAULT CHARSET=utf8;
>
> INSERT INTO `test`(`main`) VALUES ('1');
> DELETE FROM `test` WHERE `id` = 1;
> INSERT INTO `test`(`main`) VALUES ('2');
> id:2のレコードが挿入される
>
>
> CREATE TABLE `test2` (
>   `id` int(11) NOT NULL AUTO_INCREMENT,
>   `main` varchar(255) NOT NULL COLLATE 'utf8_unicode_ci',
>   PRIMARY KEY (`id`)
> ) ENGINE=mroonga DEFAULT CHARSET=utf8;
>
> INSERT INTO `test2`(`main`) VALUES ('1');
> DELETE FROM `test2` WHERE `id` = 1;
> INSERT INTO `test2`(`main`) VALUES ('2');
> id:1のレコードが挿入される
> ---------------------
>
>
> 最新のレコードが削除され、新たにレコードが追加された場合、mroongaは削除された主キー値が再利用されるのに対して、他のストレージエンジンでは主キー値の再利用はされません。
>
> 一見mroongaの方が効率のいい処理をしているように見えるのですが、私の使用環境ではこの動作が問題となってしまいました。
>
>
> レコードの論理削除に変わる方法として、トリガーを設定するなどして削除に連動させて退避テーブルへ対象レコード内容をすべて挿入して内容を残すという方法があります。
>
>
> ここで、退避テーブルに移したレコードを元のテーブルに戻したい場合に、単純に主キー値も指定した状態で挿入をすると、mroongaの場合は重複エラーが出てしまう場合があります。
>
>
> 具体的には、元テーブルの最新レコードを退避テーブルへ移動させ、その後元テーブルで新規挿入があった場合、先ほどの退避テーブルのレコードを元テーブルへ戻そうとすると重複となります。
>
> 主キーを指定しなければレコードの復元はできるのですが、join操作など絡んで来ると主キーはそのまま復元できなければ困ることが多いです。
>
> 私と同じ用途での需要は微妙かと思うのですが、他のストレージエンジンと挙動を合わせるという点では有用かと思います。
>
> 御対応頂けますと幸いです。
>
>
> 田辺公平
>
> _______________________________________________
> groonga-dev mailing list
> groon****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/groonga-dev
>



groonga-dev メーリングリストの案内
Back to archive index