Order by句とlimit句とbool代数

正直、これが、実は今回のメモリDB開発のラスボスになりそう。

というのは、bool代数で、母集合をしぼるためにどのインデックスを使うかというのを前回、できたと書いた。

しかし、じつは、これに加えて、特定フィールドでソートするOrder by句とレコードを最大で何件取ってくるかというlimit句を加えると、話が一気にむずかしくなった。

なぜむずかしくなるかは、結構わかる。
それは、bool代数だけの領域をこえているからだ。

あとは、僕が作っているDBは

MySQL → トランザクションエンジン → メモリDB

という順でリレー形式でデータを伝搬させるので、この辺の全体設計も必要だ。

でも、やっと出来てきた。
ここは、正直、難しかった。
正直、トレードオフが難しい。

MySQL → トランザクションエンジン間はすでにある結果をMySQLにそのまま、キャッシュして返すのが望ましい。
また、トランザクションエンジン → メモリDBのところも何件かキャッシュして返すのが良かった。

結局、最終的に何件で最終的な読み込みが終わるかは、MySQLが決めるからだ。
Limit 100だからといってトランザクションエンジンからMySQLに100件返せば良いというわけではない。もしかしたら、100件のうち有効なのは、90件かもしれない。
だから、もう一度要求がきたら、バケツをもういっこ分渡す。

同じ事がトランザクションエンジンとメモリDB間にもいえる。

で、一番頻繁にバケツを往復する可能性があるのはメモリDBだ。
トランザクション用とメモリDB用のバケツの大きさをチューニングできるようにしとくと面白そうだ。

これは、Web系のプロジェクトだと、2、300個出るレコードの内容をページングして見るときなんかにかかわってくる内容だ。
主キー完全一致とかでは、あまり関係ないが、主キー完全一致だけでは芸がないので、この辺もこだわってみようと思う。

本音をいうと、今、やっているHTMLコンパイラオープンソース製品に、この部分での高速性があると、すごく生きてくるので、そこでのバンドルもはげしく狙ってみる。
(というか、100%バンドルする)