mysqli select вызывает ошибку 500 Внутренняя ошибка

Я задавал другие вопросы с похожими названиями, но не мог понять, что не так с моим кодом: |

так вот простой код mysql:

SELECT COUNT(id) AS sum FROM series WHERE id IN (SELECT s_id FROM s_genre WHERE g_id IN (1,5,19) GROUP BY s_id HAVING COUNT(s_id)>=3) AND stype=0 LIMIT 1

ну, он подсчитывал, сколько столбцов вернется, если мы будем искать по жанру серии. внутренний код вернет 183 записи менее чем за секунду, но когда я выполню весь код, он вернет внутреннюю ошибку 500 примерно через минуту. также серии Таблица содержит около 5000 записей. s_genre Таблица содержит около 25000 записей. так в чем проблема?
Заранее спасибо 🙂

0

Решение

Это ваш запрос:

SELECT COUNT(id) AS sum
FROM series
WHERE id IN (SELECT s_id
FROM s_genre
WHERE g_id IN (1, 5, 19)
GROUP BY s_id
HAVING COUNT(s_id) >= 3
) AND
stype = 0
LIMIT 1;

Попробуйте перефразировать это как join, Они часто оптимизируются более эффективно:

SELECT COUNT(s.id) AS sum
FROM series s JOIN
(SELECT s_id
FROM s_genre
WHERE g_id IN (1, 5, 19)
GROUP BY s_id
HAVING COUNT(s_id) >= 3
) g
on s.id = g.s_id
WHERE stype = 0;

Как примечание, limit ничего не делает, потому что запрос агрегации без group by возвращает только одну строку.

Если вышеупомянутое не улучшает производительность, тогда создайте индекс на s_genre(s_id, g_id) и напишите запрос, используя exists:

select count(s.id)
from series s
where s.stype = 0 and
exists (select 1 from s_genre g where s.id = g.sid and g.g_id = 1) AND
exists (select 1 from s_genre g where s.id = g.sid and g.g_id = 5) AND
exists (select 1 from s_genre g where s.id = g.sid and g.g_id = 19);
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]