La requête suivante n'a pas besoin d'être exécutée régulièrement et peut être déplacée vers une tâche cron :
DELETE FROM failures WHERE release_time < ?;
Cette requête "booléenne" renverra 1 si la personne est blacklistée, 0 sinon :
SELECT
COUNT(ip_address) as blacklisted
FROM blacklist
WHERE
ip_address = ? AND
release_time > ? AND
failures > 5
Cela pourrait accélérer les choses car vous n'utilisez pas PHP pour compter les lignes et comparer les nombres :
if ($row['blacklisted']) { /* ... */ }
Je ne pense pas que vous puissiez vraiment éviter le dernier.