Задавайте вопросы, мы ответим
Вы не зашли.
Доброго времени суток.
есть вот такой запрос
SELECT * FROM UserBoxs WHERE buticUserId in (SELECT buticUserId FROM UserButics WHERE user_id=14266980)
смотрю експлайн его выполнения
и вижу что
SELECT buticUserId FROM UserButics WHERE user_id=14266980 выполняется с использованием индекса
а
SELECT * FROM UserBoxs WHERE buticUserId не использует индекс
хотя он стоит
а тупо перебирает 2 мульта строк в таблице
Как лучше поступить? Я что то не то наворотил?
И есть еще такой вопрос.
Например у меня есть таблица с полями user_id, decor_id
Часть запросов идут таково плана
.... where user_id=123
а часть
.... where user_id=123 and decor_id=1
Как правильно расставить индексы в таком случае?
А то у меня сейчас отдельно индекс по user_id и отдельно по (user_id, decor_id)
Заранее благодарю за ответ.
Неактивен
Он, небось, еще и запрос считает подчиненным. Перепишите через объединение:
SELECT bx.* FROM UserBoxs bx JOIN UserButics bc USING (buticUserId) WHERE bc.user_id = 14266980;
Отдельно индексы по user_id и (user_id, decor_id) делать смысла нет, т.к. MySQL
может использовать левую часть составного индекса. Т.е. достаточно (user_id, decor_id).
Неактивен
paulus спасибо большое в очередной раз )
подскажите только такой момент
на всех форумах пишут чтоб добиться нормальной производительности базу нужно свести использование JOIN до минимума.
Это не мой случай?
Неактивен
Ну, все зависит от того, что Вы ждете от базы. Обычные JOIN по индексу —
не очень затратная операция, хотя, конечно, точечная выборка из одной таблицы
быстрее. Ну то есть если Вам нужно снимать с базы 15k rps, то лучше денормали-
зовывать сразу, если 2-3k вполне достаточно — то нужно смотреть на запросы и
решать, как с ними работать
В обычных условиях JOIN значительно упрощают жизнь (иначе зачем вообще Вам
реляционная БД — используйте couch или mongo тогда).
Неактивен