Подтвердить что ты не робот

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" в конфигурации (без выполнения запроса)?
  • Есть ли другие альтернативы, которые стоит знать?

Спасибо заранее!

4b9b3361

Ответ 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