Как правильно организовать запрос, в котором есть множественные условия по индексу?
Две таблицы:
ideas
ideas_tags
Часть запроса из ideas выглядит так:
AND ideas.id IN (SELECT idea_id FROM ideas_tags WHERE tag_name='aaa' OR tag_name='bbb')
Обнаружил, что когда тегов в запросе много, то запрос SELECT idea_id FROM ideas_tags WHERE tag_name='aaa' OR tag_name='bbb' OR ... OR ... выполняется очень долго.
В таблице ideas_tags индекс tag_name по одному полю, мне нужно либо получить все id идей с любыми из нужных тегами (их иногда может быть до тысячи, либо переделать запрос так, чтобы не приходилось перебирать всю таблицу.
Максим Гречушников, у меня в базах знания на уровне "подобрать, как будет выполняться быстрее", поэтому не знаю. Если не использует, то что лучше использовать в таких ситуациях?
Поиск по строке, да еще и с подзапросом - очень неэффективно.
Лучше при выборе тегов отображать name, но использовать id. Тогда запрос упростится до AND ideas.id IN (1, 2, 3)
IN в итоге и стало решением. Не совсем так, осталось ideas.id IN (SELECT idea_id FROM ideas_tags WHERE tag_name IN (...)).
По поводу того, что надо было теги делать не строками, а идентификаторами, согласен, но сейчас слишком много сил будут стоить изменения. Скорее всего, рано или поздно дойду до этого, но пока остается так.