php-handlersocketを使用する際の落とし穴

HandlerSocketは、SQLレベルをバイパスしてデータベースにアクセスできるようにするmySQLのnoSQLプラグインです。



この記事はHandlerSocketとphp-handlersocketを正常にインストールし、このプラグインのphp用プラグインのわずかなマニュアルと奇妙な動作に遭遇した人を対象としています。



この決定について初めて耳にする場合は、まず次の資料をよく理解することをお勧めします。

MySQLのNoSQL:MySQLを毎秒750,000クエリにオーバークロックする

ハンドラーソケットとphp_handlersocketの最初の経験

ハンドラソケットでの更新と挿入のいくつかの微妙な点



mySQLの奥深いところを詳しく見て知識があると、質問の多くは十分に素朴ですが、これらはまさに開発期間中に私を困惑させた質問です。 同時に、私が発見した「機能」がmySQLの内部構造の結果であることは必ずしも明確ではない。



例を示すために、ソースデータで次の表を使用します。



CREATE TABLE IF NOT EXISTS `test` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`country_id` int(11) NOT NULL,

`city_id` int(11) NOT NULL,

`language` varchar(2) NOT NULL,

`name` varchar(255) NOT NULL,

`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',

PRIMARY KEY (`id`),

KEY `idx_name` (`name`),

KEY `idx_country_language` (`country_id`,`language`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=0;



INSERT INTO `test` (`id`, `country_id`, `city_id`, `language`, `name`, `created_at`) VALUES

(1, 1, 1, 'es', 'Terminator', '2011-07-02 00:00:00'),

(2, 1, 1, 'en', 'Flash Gordon'', '2011-07-02 01:00:00'),

(3, 3, 4, 'en', 'Batman', '2011-07-02 02:00:00'),

(4, 1, 2, 'jp', 'Godzilla', '2011-07-02 03:00:00'),

(5, 2, 8, 'es', 'Superman', '2011-07-02 04:00:00');







そして、もちろん、HandlerSockets自体



$hsr = new HandlerSocket('localhost', 9998); //

$hsw = new HandlerSocket('localhost', 9999); //







さて、php-handlersocketと彼の経験豊富な友人の後ろに座った後輩に直面していることを想像してみましょう。



executeInsert()を実行しましたが、データベースに何も表示されませんでした!



innoDBを使用する場合は、FLUSH TABLEを実行します。 innoDBはトランザクションテーブルであるため、mySQLに「すべてが到着した」ことを伝える必要があります。 もちろん、myISAMにはこのような問題はありません。



そして、なぜAUTO_INCREMENTフィールドは常に値0を取得するのですか?



auto_incrementを読み取ることは、php-handlersocketの責任ではありません。 しかし、これはあなた自身でそれを考慮することを禁じていません、主なことは、ALTER TABLE SET auto_incrementを使用してテーブルにインストールするphp-handlersocketでの作業を終えた後に忘れないことです。



一部のフィールドの値のみを設定してエントリを追加することはできません!



executeInsert()を使用する場合、openIndex()のフィールドをスキップすることはできませんが、そこで停止することはできます。 テーブル内のすべてのフィールドを最後まで指定しないでください。



動作しません:



$hsw->openIndex(0, 'test_db', 'test', '', 'id,name');

$hsw->executeInsert(0, array(999, 'Green Lantern'));







動作します:



$hsw->openIndex(0, 'test_db', 'test', '', 'id,country_id,city_id,language,name');

$hsw->executeInsert(0, array(999, 2, 3, 'en', 'Green Lantern'));







「SELECT * FROM Customers」をやる必要があります!



デフォルトでは、$ limitパラメーターが指定されていない場合、php-handlersocketは指定された条件に一致するエントリーを1つだけ返します。 条件に関係なく、テーブルからすべてのレコードを取得するには、次を試してください。



$hsr->openIndex(0, 'test_db', 'test', '', 'id,country_id,city_id,language,name,created_at');

$res = $hsr->executeSingle(0, '>', array(0), 9999999999);







ただし、配列は$ resで返されることに注意してください。これは非常に大きくなる可能性があり、修復不可能な結果を​​招く可能性があります。



インデックスによる逆ソートが本当に必要です!



その後、しばらくの間インド人になる必要があります! 注意、自宅でこれを再現しようとしないでください:



$hsr->openIndex(0, 'test_db'', 'test', '', 'id,country_id,city_id,language,name,created_at');

$res = $hsr->executeSingle(0, '<', array(9999999999));







ニルヴァーナを達成することを決定し、テキストフィールド(この場合はidx_name)であるインデックスで結果を並べ替える場合は、次のことを試すことができます。



$hsr->openIndex(0, 'test_db'', 'test', 'idx_name', 'id,country_id,city_id,language,name,created_at');

$res = $hsr->executeSingle(0, '<', array('ZZZZZZZZZ'));







これらの「機能」を非常に懐疑的に扱うことをお勧めします。



$ limitと$ skipを含むナンセンス。 $ limit = 3、$ skip = 0は最初の3つのエントリを返し、$ limit = 3、$ skip = 3は何も返しません!



事実、php-handlersocketは、$ limitが選択されるすべてのレコードの数であり、0から始まり、$ skipであると見なします-結果を返すには書き込みの順序が必要です。 つまり パラメーター値の使用$ limit = 3、$ skip = 3は、「ちょっと、3つだけのエントリを取得して、3番目以降のエントリを返す」ことを意味し、空の配列を返します。 「LIMIT 3、3」をエミュレートするには、次を使用する必要があります。



$hsw->openIndex(0, 'db_test', 'test', '', 'id,country_id,city_id,language,name,created_at');

$r = $hsw->executeSingle(0, '>', array(0), 6, 3);







インデックスサンプリングは機能しません。2つのフィールドとその1つはテキスト(idx_country_language)です!



残念ながら、実践が示しているように、php-handlersocketはテキストフィールドまたは日付を含むインデックスで検索できません。 または、可能であれば、フィールドタイプENUMを使用することをお勧めします。 同時に、php-handlersocketは、フィールド(テキストまたは日付)ごとにインデックスを取得する素晴らしい仕事をします。



結論



HandlerSocket + php-handlersocketは現在非常に興味深いですが、それでもmySQLの松葉杖です。 使用するためにサイト全体を書き直すことはどのような場合でも機能しませんが、素敵な追加機能を備えた些細なキーと値のストレージには、このソリューションが推奨されます。



All Articles