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;
Другие вопросы по тегам