![]() |
Задавайте вопросы, мы ответим
Вы не зашли.
Доброго времени суток.
есть вот такой запрос
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 тогда).
Неактивен