【问题标题】:Can I specify what fields I want to receive from query when using HandlerSockets?使用 HandlerSockets 时,我可以指定要从查询中接收哪些字段吗?
【发布时间】:2013-01-24 09:19:03
【问题描述】:

在使用HandlerSockets 时,我可以指定要从查询中接收哪些字段吗?

这是我的示例表

CREATE TABLE pushed_media
(
    user_id BINARY(12) NOT NULL,
    story_id BINARY(12) NOT NULL,
    sent_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
    PRIMARY KEY ( user_id, story_id )
);

查询它的PHP代码如下

$hs = new HandlerSocket($host, $port);
if (!($hs->openIndex(1, $dbname, $table, HandlerSocket::PRIMARY, 'user_id,story_id,sent_date')))
{
    echo $hs->getError(), PHP_EOL;
    die();
}

$user_id = pack('H*', substr(md5('ruslan'), 0, 24));
$story_id = pack('H*', substr(md5('story1'), 0, 24));

$retval = $hs->executeSingle(1, '=', array($user_id, $story_id), 1, 0);

我只需要sent_date,因为我已经知道另外两个值。是否可以不再通过网络传输它们?

【问题讨论】:

    标签: php mysql nosql handlersocket


    【解决方案1】:

    您可以通过简单地在openIndex 方法的field 参数中指定要从查询接收的字段来指定它们。
    如您所见here,此代码:

    <?php
    $hs->openIndex(1, 'db', 'table', 'PRIMARY', 'k,v');
    $ret = $hs->executeSingle(1, '>=', array('K1'));
    var_dump($ret);
    ?>
    

    相当于下面的SQL语句:

    SELECT k,v FROM table WHERE k >= 'K1' LIMIT 1
    

    回到您的示例,如果您只想读取 sent_date 字段值:

    $hs = new HandlerSocket($host, $port);
    if (!$hs->openIndex(1, $dbname, $table, myHandlerSocket::PRIMARY, 'sent_date')) {
        die($hs->getError());
    }
    
    $user_id  = pack('H*', substr(md5('ruslan'), 0, 24));
    $story_id = pack('H*', substr(md5('story1'), 0, 24));
    
    $retval = $hs->executeSingle(1, '=', array($user_id, $story_id), 1, 0);
    die("<pre>".print_r($retval,true)."</pre>");
    

    结果输出应该是这样的:

    Array
    (
        [0] => 0
        [1] => 1
        [2] => 2013-02-01 22:18:39
    )
    

    HandlerSocket protocol documentation 声明:

    一旦发出“open_index”请求,就会打开 HandlerSocket 插件 指定的索引并保持打开直到客户端连接 关闭。每个打开的索引由 标识。如果 是 已经打开,旧的打开索引已关闭。 您可以打开相同的 多次组合, 可能使用不同的 为了提高效率,请保留 尽量小。

    【讨论】:

    • 所以openIndex的使用实际上并不意味着我必须在此列上建立索引?
    • @ruslan 是的,在 openIndex 调用中,您指定要使用的索引以及要读取的字段,而在 executeSingle 调用中,您指定要获取的索引列值。有关 openIndex 调用的更多详细信息,请参阅更新的答案。
    【解决方案2】:

    executeMulti 呢?

    $retval = $hs->executeMulti(array(
      array(1, '=', array($user_id), 1, 0),
      array(2, '=', array($story_id), 1, 0),
    ));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-22
      • 2016-04-10
      • 1970-01-01
      • 2023-01-13
      • 1970-01-01
      • 2010-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多