multi_query无法在mysqli中通过狮身人面像更新实时狮身人面像索引


multi_query not working in mysqli to update realtime sphinx index via sphinxql

我们使用狮身人面像实时索引,并通过PHP的mysqli驱动程序与它们进行通信。单个查询工作正常,但我们尝试使用 multi_query 实现批处理更新过程。

查询如下所示:

UPDATE rt SET rank = 1 WHERE id = 881523;
UPDATE rt SET rank = 2 WHERE id = 881727;
UPDATE rt ...

(这是在分号内爆之后,为了便于阅读而添加了换行符)

我们得到的错误是:

sphinxql: syntax error, unexpected ';', expecting $end near ';UPDATE rt SET rank = 2 WHERE id = 881727'

如果我将查询复制/粘贴到 mysql CLI 客户端中,没问题:

mysql> UPDATE rt SET rank = 1 WHERE id = 881523;UPDATE rt SET rank = 2 WHERE id = 882884;UPDATE rt SET rank = 3 WHERE id = 881727;
Query OK, 1 row affected (0.01 sec)
Query OK, 1 row affected (0.01 sec)
Query OK, 1 row affected (0.01 sec)

这是PHP代码。 $conn 是 http://foolcode.github.io/SphinxQL-Query-Builder/中 Connection 类的一个实例,但我们直接使用 $conn->getConnection() 来处理底层 mysqli 连接:

$query = implode(';', $queries);
if($conn->getConnection()->multi_query($query)) {
        do { }
        while($conn->getConnection()->next_result());
}
if($conn->getConnection()->error) {
        error_log("query: " . $query);
        error_log($conn->getConnection()->error);
        die();
}

我尝试使用SphinxQL Query Builder连接类中的multiQuery()函数,结果相同。

声称分号出乎意料的错误消息对我来说似乎是最奇怪的部分。如果它想要$end,这是否意味着它不支持多个查询?如果它愿意通过 mysql 客户端接受相同的查询,为什么不呢?

$php -v
PHP 5.5.20 (cli) (built: Dec 29 2014 18:02:29) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend Technologies

您收到的错误消息来自搜索的服务器,因为它不需要与 连接多个命令;

该查询在CLI中工作,因为mysql客户端本身将其拆分为单独的查询,并将它们逐个发送到服务器(请参阅分隔符选项)。https://mariadb.com/kb/en/mariadb/documentation/clients-and-utilities/mysql-client/delimiters-in-the-mysql-client/

Mysqli,具有类似的查询功能http://php.net/manual/en/mysqli.multi-query.php这是硬编码使用的;显然地。事实证明,狮身人面像不支持 UPDATE 查询,仅适用于查询 - 请参阅对主要问题的评论。

所以在这个时候(版本 2.2.7),文档 (http://sphinxsearch.com/docs/current/sphinxql-multi-queries.html) 表明多查询支持仅适用于选择、显示警告、显示状态和显示元查询。这就解释了为什么 sphinx 需要查询的结束,而不是 UPDATE 查询的";"。

Barry在狮身人面像论坛(http://sphinxsearch.com/forum/view.html?id=13201)上向我建议使用狮身人面像API的UpdateAttributes(http://sphinxsearch.com/docs/current.html#api-func-updateatttributes)函数来处理批量更新。这效果很好。我们看到 EC2 硬件(r3.xlarge,临时 SSD 上的索引)的单个线程上的两个不同索引(以两种不同方式索引的相同数据)每秒更新 5k 次。