X

MySQL ошибка: The SELECT would examine more than MAX_JOIN_SIZE rows..

При попытке сделать дамп базы mysql с помощью утилиты mysqldump столкнулся с ошибкой:

mysqldump: Couldn't execute 'SELECT /*!40001 SQL_NO_CACHE */ * FROM `table`': The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET MAX_JOIN_SIZE=# if the SELECT is okay (1104)

В этой заметке расскажу что это значит и как это исправить..

В чем заключается проблема?

Эта ошибка возникает, когда наложены ограничения на кол-во выбираемых данных (в случае обычной выборки это кол-во строк, в случае JOIN-ов это кол-во комбинаций строк). Такие ограничения делают при конфигурации MySQL для того, чтобы программисты, по невнимательности, не писали огромные выборки, тем самым убивая производительность базы данных. Разумеется иногда нужно выбрать 1.000.000 или больше записей, но в 99% случаев, это не нужно и такая выборка - результат неверно построенного запроса.

Как посмотреть текущие ограничения?

Получить текущее значение max_join_size можно при помощи такого SQL запроса

SELECT @@session.max_join_size
SELECT @@global.max_join_size

В случае если администратор менял настройки по-умолчанию, то выведет цифру ограничения, что-то вроде 1.000.000.

Значение, по-умолчанию (DEFAULT) для этой опции: 18.446.744.073.709.551.615

Как поменять текущие ограничения?

Если нужно сделать это временно, то можно попробовать вот так

SET @@session.max_join_size = 100000000

Либо, найти эту опцию в конфиге my.cnf и заменить значение

max_join_size = 100000000

если поменяли в конфиге, не забудьте перезапустить сервер

systemctl restart mysql

Обратите внимание, что после установки max_join_size отличным от DEFAULT, значение sql_big_selects (другой опции) будет установлено равной "0". Если после этого, вы установите sql_big_selects = 1, то значение max_join_size будет проигнорировано.

Можно ли изменить значение max_join_size только для mysqldump?

В моем случае, я увеличил значение max_join_size  до 10.000.000 в общем конфиге (имеется ввиду my.cnf), т.к. мне нужна была большая выборка с join-ами в самом проекте.

Как просто изменить max_join_size в общей конфигурации только для mysqldump, я не нашел.

Предполагаю, что можно попробовать запускать mysqldump с отдельным конфигом, вот такими опциями:

--no-defaults: Не читать файл конфигурации
--defaults-file=/path/to/mysqldump.cnf: Читать конкретный файл конфигурации
--defaults-extra-file=/path/to/mysqldump.cnf: Читать дополнительные опции, после чтения файла конфигурации

Если Вы знаете другое решение (наподобие "--init-command" для mysql), напишите о нем в комментариях.

Категории: MySQL Базы данных