SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 14.05.2010 15:30:28

AlexsWulf
Участник
Зарегистрирован: 28.01.2010
Сообщений: 22

Запрос не использует индекс

Доброго времени суток.
есть вот такой запрос
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)

Заранее благодарю за ответ.

Неактивен

 

#2 14.05.2010 15:46:28

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Запрос не использует индекс

Он, небось, еще и запрос считает подчиненным. Перепишите через объединение:
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).

Неактивен

 

#3 14.05.2010 16:09:26

AlexsWulf
Участник
Зарегистрирован: 28.01.2010
Сообщений: 22

Re: Запрос не использует индекс

paulus спасибо большое в очередной раз )
подскажите только  такой момент
на всех форумах пишут чтоб добиться нормальной производительности базу нужно свести использование JOIN до минимума.
Это не мой случай? wink

Неактивен

 

#4 14.05.2010 17:24:08

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Запрос не использует индекс

Ну, все зависит от того, что Вы ждете от базы. Обычные JOIN по индексу —
не очень затратная операция, хотя, конечно, точечная выборка из одной таблицы
быстрее. Ну то есть если Вам нужно снимать с базы 15k rps, то лучше денормали-
зовывать сразу, если 2-3k вполне достаточно — то нужно смотреть на запросы и
решать, как с ними работать smile

В обычных условиях JOIN значительно упрощают жизнь (иначе зачем вообще Вам
реляционная БД — используйте couch или mongo тогда).

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson