потому что для логических выражений надо ставить скобки
здесь по сути два условия и они оба выполняются
1. WHERE `hostname` LIKE '%...%'
2. WHERE `url` LIKE '%...%' AND `account_id` IN ('14', '15', '16', '17', '18', '19', '20', '21') AND `parse` = 1
Вам нужно получать этот самый id в момент ставки замкнув всё в транзакцию с запретом на чтение. а пользователю отдавать 0, чтобы потом система видев 0 от пользователя сделала эту самую вставку
этот код и так быстр. но такую кашу очень трудно поддерживать на проектах. поэтому используйте принципы SOLID и применяйте грамотно шаблоны проектирования
Адреса выделяются пулами и в принципе можно смело использовать список пулов /24 — это 16 мб всего. которые легко можно вмести в таблицу в памяти. Вычисляете смещение и по смещению берёте индекс страны (стран в мире не больше 255). Так что задача вполне реализуема для быстрого поиска.
В этом случае таблицу можно вообще не хранить в БД (выигрыш как минимум во времени посылки пакетов), а в векторе, тогда получите максимальный выигрыш.