@aopil

Как оптимизировать запрос?

SELECT B.Id AS IdProxy, B.Ip, B.Country FROM sc_proxy B WHERE (SELECT COUNT(*) FROM sc_proxy_request_log C WHERE C.IdSite = '11' AND B.Ip = C.IpProxy) <= '3' ORDER BY B.Id DESC LIMIT 1

Есть таблица sc_proxy где хранятся все прокси.
Есть таблица sc_proxy_request_log в которой хранится лог запросов.

Задача получить Прокси из базы, при этом соблюдать условия:
IdSite - Это уникальный ID который указывает на лимит к конкретному сайту
3 - Это максимальное количество запросов которое нам подходит, т.е. если в sc_proxy_request_log есть 4 записи с этим прокси, то он не подходит под наше условие, т.к. не более чем 3 нам требуется.

Мой запрос фактически работает, но когда в sc_proxy_request_log становится слишком много записей, то выборка становится очень медленной.
  • Вопрос задан
  • 114 просмотров
Пригласить эксперта
Ответы на вопрос 2
@nozzy
Symfony, Laravel, SQL
С join попробуй, как то так:

SELECT B.Id AS IdProxy, B.Ip, B.Country FROM sc_proxy B
inner join (
  SELECT IdSite, IpProxy, COUNT(*) as total FROM sc_proxy_request_log
  group by IdSite, IpProxy
) C on C.IpProxy = B.Ip
where C.IdSite = '11' and C.total <= 3
Ответ написан
rozhnev
@rozhnev Куратор тега MySQL
Fullstack programmer, DBA, медленно, дорого
На первый взгляд так:
SELECT B.Id AS IdProxy, B.Ip, B.Country 
FROM sc_proxy B 
LEFT JOIN sc_proxy_request_log C ON B.Ip = C.IpProxy
WHERE C.IdSite = 11
HAVING COUNT(*) <= 3
ORDER BY B.Id DESC 
LIMIT 1


Ну и конечно же правильная индексация
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы