MariaDB вылетает при использовании большого WHERE IN
У меня есть старый проект, который я пытаюсь обновить до более новой версии SQL. В настоящее время он работает под MySql 5.5 и работает нормально. Я перенес тестовые данные сома в MariaDB 10.5.9, но когда я пытаюсь запустить запрос (который отлично работает на MySql 5.5), MariaDB дает сбой.
Запрос довольно большой и широко использует WHERE IN. В настоящее время я, к сожалению, не могу реорганизовать запрос, поэтому вместо этого пытаюсь выяснить, что вызывает сбой.
Имеет 3 ГДЕ В. Первый - 24 элемента, второй - 696 и третий - 2. Если я удалю только один элемент из первого или второго WHERE IN, он сработает и мгновенно вернет данные. В
answers
таблица
MyISAM
Я получаю ошибку
SQL Error [08S01]: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
И запрос
SELECT
definition_id,
answer AS value
FROM
answers
WHERE
definition_id IN (...)
AND respondent_id in (...)
AND context IN (1, 0)
LIMIT 50
Я уже пробовал менять
max_allowed_packet
на что-то более высокое (в 5.5 было 16 МБ), но, к сожалению, это ничего не меняет.
1 ответ
Одно из решений вашей проблемы - изменить дизайн / подход так, чтобы у вас не было
WHERE IN (...)
статьи по 500–1000 пунктов. Во-первых, вряд ли у вас когда-нибудь будет какое-то приложение, передающее так много параметров обратно в ваш экземпляр базы данных. Итак, если предположить, что эти данные не поступают извне, тогда должна быть возможность сохранить их в отдельной таблице. Если у вас есть две таблицы для этого, ваш запрос может выглядеть следующим образом:
SELECT a.definition_id, a.answer AS value
FROM answers a
INNER JOIN definitions d
ON d.id = a.definition_id
INNER JOIN respondents r
ON r.id = a.respondent_id
WHERE
context IN (1, 0)
-- ORDER BY <something>
LIMIT 50;