MySQLはNoSQLです!

ご存知のように、MySQLには2つの欠点があります*。 まず、クエリ言語はSQLです。 これはHandlerSocketを使用して修正されます。HandlerSocketについては、すでにハーバーに関する記事がありました。 次に、組み込みのJavaScriptがありません。



*-実際、これは冗談です。 MySQLに正確に2つの欠点があるとは考えられませんが、私が書いたものとはまったく異なります。 もちろん、javascriptの欠如は欠陥ではありません。 ただし、MySQLにSQLインターフェースがまったくないことを想像する場合、特に(NoSQLソリューションとして)それを、特にjavascriptインタープリターがあるMongoDBと比較する必要があります。



だから、私は2番目の方向で仕事を始め、すでにいくつかの結果を得ました:





現在、次のことができます。

  mysql> select execute_js( "10 + 30")as r;
 + ---- +
 |  r |
 + ---- +
 |  40 |
 + ---- +
セット内の1行(0.08秒)


彼らは式を渡し、実行されて結果を返しました。



  mysql> select execute_js( "function f(x){return x + 20;}; f(30)")as r;
 + ---- +
 |  r |
 + ---- +
 |  50 |
 + ---- +
セット内の1行(0.08秒)


同様に、関数を作成して呼び出し、その関数から結果を返しました。



  mysql> select execute_js( "function func(x){return x * 1 + 10;}"、 "func"、 "20")as r;  #説明は下記を参照
 + ---- +
 |  r |
 + ---- +
 |  30 |
 + ---- +
セット内の1行(0.08秒)

 mysql> select execute_js( "require( '/ tmp / func.js')"、 "func"、 "30")rとして;  #説明は下記を参照
 + ---- +
 |  r |
 + ---- +
 |  40 |
 + ---- +
セット内の1行(0.08秒)




ここでは、(1)グローバルオブジェクトを何かで初期化し、(2)呼び出される関数の名前を示し、(3-...)これらのパラメーターで呼び出します。 なぜこれが必要なのですか?



  mysql> select execute_js( "require( '/ tmp / func.js');"、 "func"、CONCAT(num.i、 ""))からrとして;
 + ---- +
 |  r |
 + ---- +
 |  11 |
 |  12 |
 |  13 |
 |  13 |
 |  15 |
 |  16 |
 |  16 |
 |  16 |
 |  19 |
 |  19 |
 |  19 |
 |  20 |
 + ---- +
セットの12行(0.08秒)


その理由は次のとおりです。グローバルオブジェクトを作成したら、そこに関数を作成しますが、異なるパラメーターを使用して関数を既に数回呼び出しています。

多くの人がすでに推測しているように、V8の初期化時間は0.08秒です。 当然、リクエストごとに1回ではなく、スレッドごとに1回、またはさらに巧妙にV8を初期化することが可能であり、必要です。



ソースを見る



TODOリスト:

1.エラー処理/安定性。 構文エラーにより、すべてが落ちます。

2. V8インタープリターを初期化しない

3. mysql_find-MySQLデータベースのコンテンツへのNoSQLインターフェース。 ここで私はまだロックとトランザクションを扱っています。 たとえば、すべての操作を単一のトランザクション内で実行する必要がありますか、それとも1つの操作を単一のトランザクションにする必要がありますか? または一般的に読み取り専用インターフェースを提供しますか?



私はコメントと提案を喜んでいます。



All Articles