La seguente query non deve essere eseguita regolarmente e potrebbe essere spostata in un processo cron:
DELETE FROM failures WHERE release_time < ?;
Questa query "booleana" restituirà 1 se la persona è nella lista nera, 0 altrimenti:
SELECT
COUNT(ip_address) as blacklisted
FROM blacklist
WHERE
ip_address = ? AND
release_time > ? AND
failures > 5
Potrebbe accelerare le cose poiché non usi PHP per contare le righe e confrontare i numeri:
if ($row['blacklisted']) { /* ... */ }
Non credo che tu possa davvero evitare l'ultimo.