Поскольку вам на самом деле не нужны значения из таблицы тегов в вашем наборе результатов, полное соединение не требуется.Часто оптимизатор запросов может более эффективно обрабатывать полусоединения, используя exists
.
Кроме того, вы присоединяетесь к промежуточным таблицам (животные - виды - виды - теги), когда таблица видов не нужна, поскольку все три таблицы объединяются по видову_ид.Вы можете обходить виды и присоединяться от животных к видам тегов.
Наконец, так как вы уже используете таблицу животных и оцениваете условие ИЛИ, нет необходимости присоединять эту таблицу к себе.Это должно оказаться более эффективным.Я бы также позаботился о том, чтобы у вас были индексы tag_id, kind_id и т. Д.
SELECT id, name, color
FROM animals a
WHERE EXISTS(SELECT 1
FROM animal_tags atags
where atags.tag_id = 70
and atags.animal_id = a.id)
OR (a.inherit_tags = 1
AND EXISTS( SELECT 1 from species_tags stags
WHERE stags.species_id = a.species
AND stags.tag_id = 70
)
)