コンピュータあれこれ、の備忘録です。comment追記@2015-03-25素直にMySQLのバックアップを取っていれば(さらに消すときにログを残しておけば)、特に論理削除せず普通に削除すればいい気もしてきました。見通しがよくなりますし。言えTwitterみたいにアカウント削除しても30日は復活できる、みたいなことをしたい場合必要だと思います。論理削除にはいろいろなメリットがあります。行削除のように関連する他テーブルへ削除が波及しないこと、エントリ復活ができること、障害時にデータ変更の経緯を追いやすくなることなどなど。論理削除と一意性制約、両立はできないのか?できないと思っている方、多いと思います。実はちゃんとできます。DB製品によって実現方法がちょっと違ってくるだけで。↑を読んでなるほどと思ったのですが、MySQLでの実現方法が載っていなかったので、書いてみました。MySQLではCHECK制約が無視されますのでどうしようかなと思ったのですが、要はstatusの値も含めて一意かどうか判別すれば良さそうです。二つのカラム(usernameとemailを想定します)に対する一意性制約と論理削除の両立@MySQLです。MySQLのコンソールに入って作業することを想定しています。「#」はコメントです。(これはいわゆるケースセンシティブでない例です。↑上記のように、一意性制約がきちんと働いていることが分かりました。次に、論理削除をしてみます。id:3を論理削除します。論理削除されているので、同じものが追加されても受け付けるはずです。同じものを挿入してみました。無事、挿入できました。状態を確認すると↓のようになっています。MySQLのトランザクションとロールバックの関係のようです。sec)というわけで無事、MySQLでもできました。commentあるディレクトリ以下にすべてのデータを書いて欲しい、そんな感じのMySQLの使い方を書いてみました。Redisぽくカジュアルに使うようことを想定しています。することで様々なバージョンのMySQLを一つのマシンで共存させることができるようになります。MariaDBでも以下の設定でおそらく動くと思います。想定環境はUbuntuですがLinuxでもMacでも似たような感じです。http://dev.mysql.com/downloads/mysql/←ここからMySQLのバイナリをダウンロードします。以下、作業手順です(↑でmysql-5.6.23-linux-glibc2.5-x86_64.tar.gzをダウンロードしてきたとします)。操作ユーザーは、vncuserという名前とします(これはこのマシンのユーザーであり、MySQLのユーザーではありません)。libaioが必要です。Debian系ならapt、Cent系ならyumでお願いします。(文字コードはひとまずutf-8にしておきました。注意点として、絶対パスで指定してやる必要があります。相対パスだと、おそらくデフォルトの設定が適用されてよく分からないことになります。起動・シャットダウン・ログインのスクリプトを書きます。これでOKのはずです。動かしてみると以下のようになります。./stopこれで、特定のディレクトリ以下にすべてのデータが書かれるようになり、他の領域を汚さずに済みます。comment.sqlファイルを作ってそれをMySQLに流し込んでみます。想定環境はdebianです。example.sql以上です。以下、example.sqlと確認方法について述べています。TRAINER'),('FOX'),('PIKACHU'),('BOWSER'),('PIT');確認するには以下のようにします。comment追記@2014-07-16mysqlslapの他にもベンチマークソフトは様々あります。具体的には、自分が作ったスキーマに対してベンチをしたりでき柔軟です。mysqlslapと合わせて使うと良いかもです。使い方は検索して下さい。G540ST500NM001139370.014359.5やはりSSDは高速ですね。DBでは信頼性を確保するためにはどうしても不揮発性の媒体に書いておく必要があり、そのストレージで性能が決まるようです。不揮発性メモリが楽しみですね!今回↑で使ったinsertのクエリの具体例は↓です。ST500NM0011の組み合わせが健闘しています。SSDより高速ですし(メモリに全部載っていて、DRAMの速度の違いなのかもです、E5200の方はDDR2-800なので)、書き込みもHDDを使っているにも関わらずSSDの半分の速度が出ています。HDD自体の速度向上と、キャッシュによるものなのでしょうかね。Blackですと64MBほど)。それに書き込んだ時点でOKを返すのでしょうか?だとしたらあまり信頼性が高くないような、、、という気がしてきました。その辺の議論ってどうなっているのでしょうね?確か某SSDですと、電源断が起こったときはコンデンサに貯めこんでおいた電気を使うはずです(なのでコンデンサが充電されていない状態で落ちるとデータは揮発します)。HDDだとどうなんでしょうね。Killerに落とされるとか)、難しいところですが。G540でReadが3.9万req/sec、Writeが1.4万req/sec程度出ていて、早すぎないかと疑問に思いました。プロビジョニングできます。まで実現とありますので、ほぼ一致と言えるでしょう。IOPS」と近い値だからです。===MySQLのベンチマークをどのように取るかは悩ましいところだと思います。アプリケーション側で記述してみるなどのやり方があると思います。アプリケーション側だとコンカレンシーを増やすなどがやりにくいので、基本的にはベンチマークツールを使いたいところですね。mysqlslapはデフォルトで付属しているツールなのですが、オプションが多すぎていまいち使い勝手がよくないです。調べてみると丁寧に解説がなされたものをいくつか見つけました。MySQL5.5と、mysqlslapについて↑かなり参考にさせていただきました。いう訳でベンチマークを取ってみました。MySQLのコンフィグファイルの設定は山ほどあります。今回は速度と信頼性の中間ぐらいの、標準的なものにしてみました。restart注意点として↑で作ったユーザーは、ローカルホストからはアクセスできません。他のマシンからアクセスしてください。localhostからアクセス出来るようにするには、↓を打ち込みます。sec)さて、マシンBを用意します(mysqlをインストールしておいてください)。マシンAとはGbEスイッチングハブなどでつなぎます。10000ちなみに↑を実行中のマシンAの状態です。Log)なのでしょうか。selectでは意味がなさそうですが。それと、↑を見ると、MySQLプロトコルが古いのかなという気がします、というのもRedisあたりのベンチマーク中にdstatを見ますと、読み込みと書き込み時では、net/totalの桁が異なるからです。具体的には読み込み時はrecvがわずかで、sendが大きくなります。ちなみに、いろんなマシンで計測した結果を一番上の表にまとめておきます。my.cnfの内容を以下に置いておきます。速度と信頼性の中間を取った感じです。デフォルトから書き換えた・追加した項目は以下の4項目です。O_DIRECTbind-addressについてですが、127.0.0.1だとローカルホストからのみアクセス可能です。0.0.0.0としてグローバルで取れるようにしておきます。その他の↑のオプションについては検索してみてください。様々なマシンをいろいろとベンチマーク。WordPress.。