Ошибка SQL MAX JOIN SIZE

12
W1
На сайте с 22.01.2021
Offline
306
356

У меня на стандартном форумном движке выскочила ошибка 
SELECT would examine more than MAX_JOIN_SIZE rows

Запрос простой:

SELECT COUNT(topic_id) AS total FROM pb_topics 
WHERE forum_id IN (4, 5, 6, 7, 8, 11, 16, 17, 12, 13, 14, 15, 18, 20, 21, 22, 23, 27, 28, 26, 24, 25, 30, 31, 32, 33, 36, 34, 35, 37, 38, 39, 40, 41, 1, 9, 10) 
AND topic_visibility IN (0, 3)

если уменьшить количество forum_id и написать IN (4, 5, 6, 7, 8), то ошибка пропадает.
В таблице pb_topics меньше 100 строк, MAX_JOIN_SIZE установлен как 50 000 000. Я установил для этого запроса SQL_BIG_SELECTS=1, чтобы эта ошибка не выскакивала, но мне просто интересно, как сервер MySQL планирует такой запрос? Никогда не влезал глубоко в этот механизм, и просто не понимаю, каким образом из таблицы в 100 строк при простой выборке по совпадающим полям можно спланировать получение 50 миллионов строк?

Мой форум - https://webinfo.guru –Там я всегда на связи
LEOnidUKG
На сайте с 25.11.2006
Offline
1755
#1

Какая версия Mysql и в каком формате БД?

COUNT(*)

Вызывает тоже самое?

А если без COUNT будет так же ошибка?

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
W1
На сайте с 22.01.2021
Offline
306
#2
LEOnidUKG #:

Какая версия Mysql и в каком формате БД?

MariaDB 10.5.12,  таблицы InnoDB.
COUNT(*) даёт ту же ошибку. Без COUNT тоже.

LEOnidUKG
На сайте с 25.11.2006
Offline
1755
#3
webinfo #:

MariaDB 10.5.12,  таблицы InnoDB.
COUNT(*) даёт ту же ошибку. Без COUNT тоже.

Отлично, теперь уменьшайте количество forum_id и без COUNT смотрите, что вам выводит БД. Если там меньше 100 строк то никаких проблем, если будет больше, значит что-то не так где-то.

W1
На сайте с 22.01.2021
Offline
306
#4
LEOnidUKG #:

Отлично, теперь уменьшайте количество forum_id и без COUNT смотрите, что вам выводит БД. Если там меньше 100 строк то никаких проблем, если будет больше, значит что-то не так где-то.

Не так там что-то в планировании запроса, сервер как-то странно пытается "предвидеть" результат. 
Запрос

SELECT topic_id AS total FROM pb_topics WHERE forum_id IN (4, 5, 6, 7, 8, 11, 16, 17) 
AND topic_visibility IN (0, 3)

выдаёт ту же ошибку, а запрос

SELECT topic_id AS total FROM pb_topics WHERE forum_id IN (4, 5, 6, 7, 8, 11, 16) 
AND topic_visibility IN (0, 3)

или запрос

SELECT topic_id AS total FROM pb_topics WHERE forum_id IN (4, 5, 6, 7, 8, 11, 17) 
AND topic_visibility IN (0, 3)

завершаются успешно, и выдают результат 0 строк.

LEOnidUKG
На сайте с 25.11.2006
Offline
1755
#5
Последний запрос убираем 
AND topic_visibility IN (0, 3)

Смотрим, что будет.

LEOnidUKG
На сайте с 25.11.2006
Offline
1755
#6
Вообще у меня плохие воспоминание об 10.5 у меня она один запрос вообще не выполняла, а тупо зависала.
W1
На сайте с 22.01.2021
Offline
306
#7
LEOnidUKG #:
Последний запрос убираем 

Смотрим, что будет.

Будет какая-то мистика.
Если убрать последний запрос, будет всё без ошибок, выдаётся правильный ответ, все строки таблицы.
Без ошибок также следующие варианты:

AND topic_visibility IN (0)
AND topic_visibility IN ( 3)
AND topic_visibility IN (1, 3)
AND topic_visibility IN (0, 3, 1)
AND topic_visibility IN (0, 1)

А варианты
AND topic_visibility IN (0, 2) 
AND topic_visibility IN (0, 3)
AND topic_visibility IN (0, 4)
дают ошибку.

W1
На сайте с 22.01.2021
Offline
306
#8
LEOnidUKG #:
Вообще у меня плохие воспоминание об 10.5 у меня она один запрос вообще не выполняла, а тупо зависала.

Вот и у меня такое впечатление, что это какой-то баг.

LEOnidUKG
На сайте с 25.11.2006
Offline
1755
#9
webinfo #:

Вот и у меня такое впечатление, что это какой-то баг.

А если без IN просто AND и OR?

W1
На сайте с 22.01.2021
Offline
306
#10
LEOnidUKG #:

А если без IN просто AND и OR?

Вроде бы сервер всё равно преобразует IN() в OR (или хз какая там кухня). 
Но проверил.

AND (topic_visibility=0 OR topic_visibility=3)

Та же фигня. Та же ошибка. Меняем 3 на 1 или 0 на 1 – ошибка пропадает.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий