Два простых, быстрых запроса часто лучше, чем один огромный, неэффективный запрос.
Вот как я бы это разработал:
Сначала создайте таблицу для всех ваших имен в формате MyISAM с индексом FULLTEXT. Вот где хранятся ваши имена. Каждый из соответствующих типов объектов (например, отделы, подразделения и т. Д.) Являются зависимыми таблицами, первичный ключ которых ссылается на первичный ключ главной таблицы именованных объектов.
Теперь вы можете искать имена с помощью этого гораздо более простого запроса, который выполняется невероятно быстро:
SELECT a.`object_id`, a.`type`, n.name, n.object_type
FROM `user_permissions` AS a
JOIN `named_objects` AS n ON a.`object_id = n.`object_id`
WHERE MATCH(n.name) AGAINST ('name-to-be-searched')
Использование полнотекстового индекса будет выполняться в сотнях раз быстрее, чем при использовании LIKE
так, как вы делаете.
Если у вас есть идентификатор и тип объекта, если вам нужны какие-либо другие атрибуты соответствующего типа объекта, вы можете выполнить секундный SQL-запрос, присоединяющийся к таблице для соответствующего типа объекта:
SELECT ... FROM {$object_type} WHERE object_id = ?
Это также будет происходить очень быстро.
Ваш комментарий: Да, я бы создал таблицу с именами, даже если она избыточна.