Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте. Подскажите как лучше реализовать запрос
Есть таблица новости
---news---
id name
1 новость_1
2 новость_2
3 новость_3
Есть таблица теги
---tags---
id name
1 тег_1
2 тег_2
Соотношение таблиц много к многому потому есть промежуточная таблица
---news_tags---
tag_id news_id
1 1
2 1
1 2
2 3
Нужно выбрать все новости у которых есть определенные теги. Допустим тег_1 и тег_2. Я делаю запрос такой
Неактивен
Попробуйте
Неактивен
В каком смысле план запроса?
Неактивен
Неактивен
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 53902
1 PRIMARY properties eq_ref PRIMARY PRIMARY 4 t.property_id 1
2 DERIVED property_filters index NULL PRIMARY 8 NULL 2765472 Using where; Using index
результат. таблицы называются немного по другому. я навел не те имена что бы было проще объяснить задачу. news = properties, property_filters = news_tags и filters = tags
Неактивен
Когда идет фильтр по 2 тегам запрос обрабатывается еще терпимо. Но когда их выбрано 5-6 то стает совсем туго
Неактивен
Ну разве что сделать GROUP BY news.id HAVING count(*)=2 ORDER BY NULL
А что говорит show create table property_filters;
Неактивен
CREATE TABLE IF NOT EXISTS `property_filters` (
`property_id` int(11) NOT NULL,
`filter_id` int(11) NOT NULL,
PRIMARY KEY (`property_id`,`filter_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
А что если id всех тегов через запятую прописать в отдельном поле properties. К примеру так
---properties---
id properties filters
1 property_1 1,2
2 property_2 3,5
3 property_3 6,8
И потом делать запрос только в одну таблицу. Можно ли реализовать что то подобное и имеет ли это смысл? Самое важное мне сейчас это производительность. И ради нее я готов менять структуру таблиц и все остальное. Более мощный сервер тоже вариант. Но этот тоже не худший, а лиш 1 такой запрос заставляет его думать 10-15 сек. И я не уверен что ситуация сильно изменится если я буду снимать более дорогой сервер.
Неактивен