MySQLをNoSQLとして使用する-毎秒750,000クエリに到達する方法のストーリー (私の友人Vadimによる翻訳)は少しめまいがしました。 このトピックには他の資料があります。 そして、手は実験に到達しました。
PHP用に3つの異なるクライアントが開発されました。
拡張コード.google.com / p / php-handlersocket
PEAR openpear.org/package/Net_HandlerSocket
ネイティブPHP github.com/tz-lom/HSPHP
以下は、最初の実験の印象です。
インストールについての記事を再語しません。 あなたがソースからMySQLをインストールした場合 - あなたは何の問題もないはずです。
インストールが完了したら、handlersocketとSHOW PROCESSLIST。 次のようなものが表示されます。
ロードされると、画像はほぼこのようになります
我々は、ロードされたプロセスのhandlersocket回数をダウンロードして見ることができます。 画像は、3つのオープン接続が、それらの一方がアクティブ(実行中)であることを示しています。
作業スレッドの数は、my.confで次のパラメーターを使用して調整できます。
loose_handlersocket_threads = 16
loose_handlersocket_threads_wr = 1
あなたはPHPのための少なくとも一つの拡張子を収集し、その後のphp-hanlpersocketをインストールしている場合は問題はないはずです。 ドキュメントの欠如に少し混乱しています。 例の選択と可視性に特別な苦情はありません。 MyISAMとInnoDbの両方でテスト済み。
(例えば)PRIMARY KEYの選択は大成功でした。 例は、php-handlersocketのドキュメントにあります。
操作が「=」に等しいため、選択の検索が実行されます。操作も可能です。
もっと '>'、
「<」未満
「> =」以上
「<=」以下
文字インデックスによるサンプリングでは、エンコーディングを考慮する必要があります。 必要に応じて、iconvを使用して変換を行います。そうしないと、何も見つからず、多くの時間が失われます。
名前キーで取得する例:
CREATE TABLE `test`.`cities` (
`id_city` int (10) unsigned NOT NULL AUTO_INCREMENT,
`id_region` int (10) unsigned NOT NULL ,
`id_country` mediumint(8) unsigned NOT NULL ,
`city_name` varchar (255) NOT NULL ,
`city_order` int (10) unsigned NOT NULL ,
PRIMARY KEY (`id_city`),
KEY `id_region` (`id_region`),
KEY `name` (`city_name`)
) ENGINE=MyISAM
$hs = new HandlerSocket($host, $port);
if (!($hs->openIndex(0, $dbname, $table, 'name', 'city_name,id_city,id_region')))
{
echo $hs->getError(), PHP_EOL;
die( 'error open index');
}
$retval = $hs->executeSingle(0, '=', array(''), 10);
答えは:
array(1) {
[0]=> array(2) {
[0]=> string(6) ""
[1]=> string(4) "1976"
[2]=> string(1) "72"
}
}
リージョン全体でサンプリングを整理できます(id_region = 1):
if (!($hs->openIndex(0, $dbname, $table, 'id_region', 'city_name,id_city,id_region')))
{
die($hs->getError());
}
$retval = $hs->executeSingle(0, '=', array(1), 100, $off);
定数100-サンプルレコードの数、$ off-オフセット、SELECTのLIMIT、OFFSETと同様。
答えは、SQLの実行に似た100以下の要素の配列です。SELECT 'id_region'、 'city_name、id_city、id_region' FROM cityes WHERE id_region = 1 LIMIT 100、$ off;
例えば、それは操作(バッジ)「> =」または「<=」を使用して、自動の実装が完了し、便利です、あなたは手紙opredleniiで始まる単語の必要な数を選択することができます。 標準の範囲を追跡することは不可能を意味しますが、データは食事を取るようにし、第二の条件の満足度にチェックする場合は、それがどんな簡単なサンプルを実行するために原理的には可能です。
プロトコル 彼の知識の開発、デバッグ中に非常に有用であることに留意すべきです。 初めて、特に何かが失敗したときは、Telnetで実行して得られた結果と要求を常に比較する必要があります。 説明プロトコルprotokol.en.txtファイルまたは記事の翻訳であるHandlerSocketの概要」:プロトコルの記述と拡張子php-handlersocketは»
プロトコルの使用は非常に簡単です。telnetで、ポート9998でデータベースホストに接続します。
telnet localhost 9998
P 0 test cities name city_name,id_city
// TAB (\t), NULL, TAB
0 1 ---> 0 1
///
0 > 1 a 10
/// (int), (<>= ...) - , [, Limit, Offset]
0 2 A Baa 10564 A Barqueira 10565 A Corua 10566 A da Beja 15510 A dos Arcos 15511 A dos Bispos 15512 A dos Cunhados 15513 A dos Francos 15514 A Merca 11120 A Nario 13257
// =0 (), (city_name,id_city)
// , TAB, BK(\n)
結論として、配列とマルチクエリを使用して複合キーでクエリを実行できることを追加したいと思います。 接続ごとに複数のリクエスト:
$hs->openIndex(0, $dbname, $table, 'PRIMARY' , 'city_name,id_city,id_region' );
$hs->openIndex(1, $dbname, $table, 'id_region' , 'city_name,id_city,id_region' );
$retval = $hs->executeMulti(
array(array(0, '=' , array( '23' ), 1, 0),
array(1, '=' , array( '3' ), 10, 0)));
* This source code was highlighted with Source Code Highlighter .
レビューの端にINSERT / UPDATE / DELETE操作されました。 近い将来、より詳細なレビューを行うことを望んでいます。
Handlersocketは、sphinxと組み合わせて良好に機能しました。 Sphinxを使用して必要なドキュメントIDを検索し、handlersocketを使用して必要な情報を即座に選択します。
顧客パフォーマンスの比較
トップライン
下位のphp-handlersocket
包含とインスタンスクラスを考慮したマイクロ秒単位のダーティタイム
0.005791
0.001404
---
0.007095
0.001383
---
0.00456
0.002563
---
0.006104
0.001384
インクルードとインスタンスなしの時間、PKごとに純粋に1つの選択
$t1 = microtime();
$retval = $hs->executeSingle(2, '=', array('60187'));
echo microtime()-$t1, PHP_EOL;
$t1 = microtime();
$res = $rs->select('=','60187');
echo microtime()-$t1, PHP_EOL;
0.000451
0.000632
---
0.00039400000000001
0.00020700000000007
---
0.00040000000000007
0.00021399999999994
---
0.00053999999999998
0.002058
---
0.002926
0.0002089999999999
---
0.000386
0.00021100000000002
特定されたバグ
デバッグするとき、telnetをリセットして-9を強制終了し、ソケットのハングを引き起こしました。
スクリプトのその後の再起動により、スクリプトがフリーズしました(ソケットは読み取りを待機していました)。
SHOW PROCESSLISTプロセスhandlersocketが表示されませんでした
筋肉を再起動することで治癒しました。