Następujące zapytanie nie musi być wykonywane regularnie i może zostać przeniesione do zadania cron:
DELETE FROM failures WHERE release_time < ?;
To "boolowskie" zapytanie zwróci 1, jeśli osoba jest na czarnej liście, 0 w przeciwnym razie:
SELECT
COUNT(ip_address) as blacklisted
FROM blacklist
WHERE
ip_address = ? AND
release_time > ? AND
failures > 5
Może to przyspieszyć, ponieważ nie używasz PHP do liczenia wierszy i porównywania liczb:
if ($row['blacklisted']) { /* ... */ }
Nie sądzę, że można naprawdę uniknąć tego ostatniego.