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 запроса
1 2 3 4 |
SELECT @@session.max_join_size SELECT @@global.max_join_size |
В случае если администратор менял настройки по-умолчанию, то выведет цифру ограничения, что-то вроде 1.000.000.
Значение, по-умолчанию (DEFAULT) для этой опции: 18.446.744.073.709.551.615
Как поменять текущие ограничения?
Если нужно сделать это временно, то можно попробовать вот так
1 2 3 |
SET @@session.max_join_size = 100000000 |
Либо, найти эту опцию в конфиге my.cnf и заменить значение
1 2 3 |
max_join_size = 100000000 |
если поменяли в конфиге, не забудьте перезапустить сервер
1 2 3 |
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 с отдельным конфигом, вот такими опциями:
1 2 3 4 5 |
--no-defaults: Не читать файл конфигурации --defaults-file=/path/to/mysqldump.cnf: Читать конкретный файл конфигурации --defaults-extra-file=/path/to/mysqldump.cnf: Читать дополнительные опции, после чтения файла конфигурации |
Если Вы знаете другое решение (наподобие "--init-command" для mysql), напишите о нем в комментариях.
Author: | Tags: /
| Rating:
Leave a Reply