Я программирую поиск с помощью ZF3 и модуля DB. Каждый раз, когда я использую более одного короткого ключевого слова, например «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 соединение/ключевое слово), я объединил эти запросы, и ошибка исчезла. Количество запросов, казалось, убило сервер.