NoSQLという挑発的な名称と、ハッシュしか扱えないという貧弱ぶりが嫌いで、
「どうせこんなもんただのバズワードだろう。memcachedに顧客情報を記録するのは馬鹿のすることだ」と思っていたが、
NoSQLをNot Only SQLと読ませようという活動や、Tokyo Cabinetがテーブルモデルに対応している事を知り、
もともとmysqlがあまり好きではない身としては、かなり惹かれるものがあるのではないかと思い直した。
mysqlとTokyo Tyrant(TT)を比較して、前者の優位点を列挙してみる。
- JOINが使える。つまり、リレーションする。
- サブクエリーが使える。
- GROUP BY句が使える。
- SQL関数が使える。
- 1つのサービスで複数のデータベースとテーブルを扱える。
つまり、「考えることが出来る」というのが、RDBMSの相対的な利点だと思う。
しかし、そんな利点は本当に必要なのだろうか?
ビューやストアドプロシージャががんがん回るDBサーバがあって、フロントエンドの負荷を軽減しているというなら良いが、普通そんな仕事はmysqlにはやらせない。PostgreSQLの出番だ。
それに、レプリケーション済みmysqldなんてものは、データの読み込みにしか使わないのだ。どうせ読んでくる内容は決まっているというのに、そのためにデータベース接続を随時発生させるなど愚の骨頂である。データはローカルのメモリにおいておけばいいし、それがデータベースの体裁を保っている必要など全くないのだ。
その要件においては、NoSQLを使うと冗長性と耐負荷性能はあがるので、一概にmysqlのほうが堅牢安全であるとは言い難い。
そして、たいていはmysqlを使ったアプリでも、複雑なSQLは発行しない。そしてそれが必要の無いような設計をする。
ORMが糞みたいなSQLをはき出して仕方ないからそこだけ手でチューニングしたとか、その程度である。
しかし、パフォーマンスならTTのほうがmysqlより数段良いのだ。mysqlにしがみつく理由にはならない。
そして何より我々はPHPerである。ロジックはすべてPHPで書いてしまえばいいのだ。
- サブクエリーの目的は何だ? WHERE句の条件指定のために内側のクエリを書くくらいなら、そのクエリだけを実行して条件を作ってしまえばいい。2回クエリを投げるとデータベース接続コストがかさむって? TTならその心配は無い!
- GROUP BY句とSQL関数はPHP関数で代替してしまえ。DBサーバのかわりにWebサーバが計算コストを支払えば良いだけだ。WebサーバとDBサーバが同居しているなら、尚更DBサーバにやらせる意味は薄い。
- あとはJOINだけなんとかすればいいんだー!
というわけで、最終的にこんな事が出来ないかと夢想している。
before
1号機 Webサーバ #1
2号機 Webサーバ #2
3号機 mysqld マスタ(読み書き)
4号機 mysqld スレーブ #1(読み込み)
5号機 mysqld スレーブ #2(読み込み)
もしくは、上記構成よりパフォーマンスが発揮できるmysqlの導入事例として
1号機 mysqldマスタ(読み書き)
2号機 Webサーバ #1 mysqld スレーブ #1(読み込み)
3号機 Webサーバ #2 mysqld スレーブ #2(読み込み)
after
1号機 Webサーバ #1 TTマルチマスタ #1(読み書き)
2号機 Webサーバ #2 TTマルチマスタ #2(読み書き)
3号機 PostgreSQL(読み書き)
長々と書いて自分が導き出したい結論が、mysqldレプリケーションへの否定だという事に今気がついた。
つづく。
紛らわしい用語シリーズ。
| 用語 |
Win2k |
WinXP |
Win7/Vista |
MacOSX |
| サスペンドとレジューム |
挙動A |
- |
- |
- |
| スタンバイ |
- |
挙動A |
- |
- |
| 休止状態/ハイバネーション |
挙動B |
挙動B |
挙動B |
挙動B |
| スリープ |
- |
- |
挙動A+B |
挙動A |
| セーフスリープ |
- |
- |
- |
挙動A+B |
- 挙動A・・・CPUとメモリに通電したままハードディスクとモニタの電源を切る。
- 挙動B・・・メモリの内容をハードディスクに書き出してPCの電源を切る。起動時に待避した内容をメモリに読み込む。
- 挙動A+B・・・メモリの内容をハードディスクに書き出すがCPUとメモリに通電したままにする。もし電源が切れていなければ挙動Aで復活し、電源が切れていたら挙動Bで復活する。
ちなみにMacOSXでは、デスクトップ機ではハイバネーション、ノート機ではセーフスリープを行うように設定されているが、どちらの挙動も「スリープ」という名称で表記されており、「スリープモードの違い」として扱われているらしい。