コンピュータあれこれ、の備忘録です。comment追記@2015-03-25素直にMySQLのバックアップを取っていれば(さらに消すときにログを残しておけば)、特に論理削除せず普通に削除すればいい気もしてきました。見通しがよくなりますし。言えTwitterみたいにアカウント削除しても30日は復活できる、みたいなことをしたい場合必要だと思います。論理削除にはいろいろなメリットがあります。行削除のように関連する他テーブルへ削除が波及しないこと、エントリ復活ができること、障害時にデータ変更の経緯を追いやすくなることなどなど。論理削除と一意性制約、両立はできないのか?できないと思っている方、多いと思います。実はちゃんとできます。DB製品によって実現方法がちょっと違ってくるだけで。↑を読んでなるほどと思ったのですが、MySQLでの実現方法が載っていなかったので、書いてみました。MySQLではCHECK制約が無視されますのでどうしようかなと思ったのですが、要はstatusの値も含めて一意かどうか判別すれば良さそうです。二つのカラム(usernameとemailを想定します)に対する一意性制約と論理削除の両立@MySQLです。MySQLのコンソールに入って作業することを想定しています。「#」はコメントです。(これはいわゆるケースセンシティブでない例です。↑上記のように、一意性制約がきちんと働いていることが分かりました。次に、論理削除をしてみます。id:3を論理削除します。論理削除されているので、同じものが追加されても受け付けるはずです。同じものを挿入してみました。無事、挿入できました。状態を確認すると↓のようになっています。MySQLのトランザクションとロールバックの関係のようです。sec)というわけで無事、MySQLでもできました。いうMySQLのPerl製ベンチマークスクリプトがあります。MySQLの作者によるスクリプトだそうです。Perlなので変数を使って自分で好きなクエリを作ってベンチマーク出来ていい感じです。インストール方法や使い方は検索してみてください。Redisを使って変数を共有です。このスクリプトはPerlプロセスをフォークします。変数の受け渡しが困難になるので、Redisを用いました。スクリプトは後述します。以下の様な結果になりました。Redisを立ち上げておいて下さい。51894.330775085100クライアントで、1クライアントにつき10000件のinsertです。合計100万insertです。5.2万[q/sec]となりました。htopというコマンドで観察してますと、全コアがフルロードされていました。serialという項目が分かりにくいですが、おそらくクライアントを直列に実行した場合に掛かる時間だと思います。このスクリプトの実行前にtableのレコードを全削除しないとエラーになるなどです。row_format=dynamic;です。