Как этот SQL запрос может быть более эффективным? - PullRequest
0 голосов
/ 11 апреля 2020

mysql 5.7 linux

Запрос ниже занимает около 210 секунд для 9000 записей. Не очень желаемая производительность.

Таблица данных имеет следующие поля:

login_attempt_id integer
user_id integer
login_attempt_data datetime
login_attempt_ip string`

I wi sh, чтобы запросить данные, чтобы найти количество IP-адресов, которые не смогли войти в систему. Например:

109 119.27.191.202
93  118.25.146.128
83  132.232.31.117
81  132.232.160.234

Запрос:

select count(t0.login_attempt_ip) as `ip_count`, t0.login_attempt_ip 
  from sohne_sma_v4.wp_login_fails t0
  where t0.login_attempt_ip in
  (select distinct t1.login_attempt_ip from sohne_sma_v4.wp_login_fails t1
    where 20 <
    (select count(t2.login_attempt_ip) from sohne_sma_v4.wp_login_fails t2
       where t2.login_attempt_ip like t1.login_attempt_ip
    )
  )
  and datediff(now(), t0.login_attempt_date) < 15
  group by t0.login_attempt_ip
  order by ip_count desc;

Я могу догадаться, что время затрачивается на два внутренних запроса.

Какой лучший способ достичь этот запрос?

1 Ответ

1 голос
/ 11 апреля 2020

Вам на самом деле не нужны все эти подзапросы.

Вы можете просто использовать GROUP BY...HAVING, чтобы сохранить сгруппированные элементы, имеющие более 20.

Что-то подобное должно работать

https://www.db-fiddle.com/f/vCMPWJaRxeSPVVDNSPVhcD/0

SELECT COUNT(t.login_attempt_id) AS ip_count,t.login_attempt_ip  FROM sohne_sma_v4.wp_login_fails t 
WHERE datediff(now(), t.login_attempt_date) < 15
GROUP BY t.login_attempt_ip HAVING (ip_count> 20 )
ORDER BY ip_count DESC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...