【发布时间】:2017-08-25 10:56:30
【问题描述】:
我正在用 ZF3 和 DB 模块编写搜索程序。 每次我使用超过 1 个短关键字 - 例如“49”和“am”或“1”和“is”时,我都会收到此错误:
Statement could not be executed (HY000 - 2006 - MySQL server has gone away)
只要我不使用 2 个或更多短关键字,使用更长的关键字就可以完美地工作。 该问题仅出现在实时服务器上,在本地测试服务器上工作正常。
项目表有大约 2200 行包含所有类型的数据 project_search 表有 17000 行,每个项目有多个条目,每个条目看起来像:
id, projectid, searchtext
searchtext 列是全文。这里是php代码的相关部分:
$sql = new Sql($this->db);
$select = $sql->select(['p'=>'projects']);
if(isset($filter['search'])) {
$keywords = preg_split('/\s+/', trim($filter['search']));
$join = $sql->select('project_search');
$join->columns(['projectid' => new Expression('DISTINCT(projectid)')]);
$join->group("projectid");
foreach($keywords as $keyword) {
$join->having(["LOCATE('$keyword', GROUP_CONCAT(searchtext))"]);
}
$select->join(
["m" => $join],
"m.projectid = p.id",
['projectid'],
\Zend\Db\Sql\Select::JOIN_RIGHT
);
}
这里是查询结果:
SELECT p.*, m.projectid
FROM projects AS p
INNER JOIN (
SELECT projectid
FROM project_search
GROUP BY projectid
HAVING LOCATE('am', GROUP_CONCAT(searchtext))
AND LOCATE('49', GROUP_CONCAT(searchtext))
) AS m
ON m.projectid = p.id
GROUP BY p.id
ORDER BY createdAt DESC
我使用 "MATCH(searchtext) AGAINST('$keyword)" 和 "searchtext LIKE '%keyword%' 重写了查询,结果相同。
问题似乎出在实时 mysql 服务器上,我该如何调试?
[编辑]
在注意到错误仅发生在具有其他搜索相关查询的特殊视图中 - 每个都使用多个连接(1 个连接/关键字)后 - 我合并了这些查询并且错误消失了。查询的数量似乎要杀死服务器。
【问题讨论】:
-
可以查看mysql错误日志。您还可以通过 mysql 客户端运行此查询,并检查您从服务器接收到的错误信息
标签: php mysql query-performance zend-framework3