MySQL - SQL_BIG_SELECTS
Эй, я изучал SQL_BIG_SELECTS, но документация MySQL до сих пор была довольно бесполезной. Я ищу некоторое представление о предотвращении появления ошибок, подобных приведенным ниже.
ОШИБКА 1104: SELECT рассмотрит слишком много записей и, вероятно, займет очень много времени. Проверьте свой WHERE и используйте SET OPTION SQL_BIG_SELECTS = 1, если SELECT в порядке
- Сколько строк MySQL определяет, что запрос является "БОЛЬШИМ ВЫБОРОМ"?
- Правильная индексация обычно решает эту проблему?
- Рассматривается ли SQL_BIG_SELECTS как "последнее средство", или это хорошая практика?
- Как бы кто-то установил "SQL_BIG_SELECTS = 1" в конфигурации (без выполнения запроса)?
- Есть ли другие альтернативы, которые стоит знать?
Спасибо заранее!
Ответы
Ответ 1
-
MySQL определяет, является ли запрос "большим выбором" на основе значения "max_join_size". Если запрос, вероятно, придется исследовать больше, чем это количество строк, он будет считать его "большим выбором". Используйте "show variables" для просмотра значения максимального размера соединения.
-
Я считаю, что индексирование и конкретное предложение where должно предотвратить эту проблему.
-
SQL_BIG_SELECTS используется для предотвращения случайного выполнения чрезмерно больших запросов. Это нормально установить в ON в mysql.cnf или использовать параметр командной строки при запуске.
-
Вы можете установить SQL_BIG_SELECTS в my.cnf или при запуске сервера. Его также можно установить на основе сеанса с помощью SET SESSION SQL_BIG_SELECTS=1
.
-
Не то, чтобы я мог думать. Я бы просто проверил ваш запрос, чтобы убедиться, что вам действительно нужно его использовать. На наших серверах он включен по умолчанию, а max_join_size очень большой.
Ответ 2
Вы не можете установить SQL_BIG_SELECTS
в my.cnf или при запуске сервера, поскольку это параметр только для сеанса. Я использую MySQL 5.0.60.
Ответ 3
Как и раньше, у кого-то есть сообщение, вы не можете установить SQL_BIG_SELECTS на my.cnf при запуске сервера. Эта переменная не поддерживает это.
У меня была такая же проблема с приложением Symfony, показывающим эту досадную ошибку:
The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is okay
Но вы можете увеличить число varialbe
max_join_size, связанный с sql_big_selects
Я смог исправить его, выполнив команду как привилегированный пользователь mysql:
# SET GLOBAL max_join_size=18446744073709551615;
Или вы можете включить его в my.cnf, поскольку max_join_size разрешено настраивать в файле конфигурации
Ну, надеюсь, это поможет кому-то другому.
Ответ 4
Следующая команда работает для меня
SET GLOBAL max_join_size=18446744073709551615;
Но что мне нужно поместить в файл my.cnf вместо команды?
Btw, я использую "5.6.12 MySQL Community Server"
Ответ 5
У меня было более 2000 тысяч записей в db, и мой запрос был большим - выберите с исчерпывающим сравнением для удаления дублирования и обновления определенного поля... Мне сказали то же самое mysql
(текущая версия в дате ответа), и я закончил использование index
на 2 полях, участвующих в where
статье... это тоже должно помочь другим... шаги, которые работали для меня:
- Установить индекс в поле
- ТАБЛИЦА ANALYZE
- запустите запрос
НТН
Ответ 6
SET SESSION SQL_BIG_SELECTS =1;# MySQL returned an empty result set (i.e. zero rows).
SELECT a.`HACtrl` , b.`HBCtrl` , c.`HDCtrl`
FROM `HO110BLote` AS a
LEFT JOIN `HO113BPago` AS b ON ( b.HBHACtrl = a.HACtrl )
LEFT JOIN `HO113BRecibos` AS c ON ( c.HDHBCtrl = b.HBCtrl )
WHERE HAManzana = '03'
AND HALote = '09'
LIMIT 0 , 100