SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 29.07.2012 00:01:01

Денис Гаранин
Участник
Зарегистрирован: 28.07.2012
Сообщений: 1

Помогите оптимизировать MySQL запрос

Здравствуйте.
Таблица users - пользователи, groups - группы пользователей, записи в groups имеет поля: group_id, user_id, rec_status (если rec_status = 1, значит запись активная и ее надо учитывать в запросе). Приведен пример запроса для пользователя с user_id = 146, он ищет себе друга для создания новой группы, в запросе должны отображаться пользователи, которые не состоят в группах с пользователями, с которыми пользователь уже организовывал группы. То есть друзья друзей не должны отображаться. Можно ли как-то оптимизировать запрос, используя например, "EXISTS" ? Кстати, надо ли убрать DISTINCT везде? При выполнении запроса появлются "тормоза", добавил индексы, вроде меньше стало тормозить, но может можно еще что-то сделать. Спасибо заранее.

SELECT * FROM users WHERE user_id NOT IN
  (SELECT DISTINCT user_id FROM groups WHERE group_id IN
    (SELECT DISTINCT group_id FROM groups WHERE user_id IN
      (SELECT DISTINCT user_id FROM groups WHERE group_id IN
        (SELECT DISTINCT group_id FROM groups WHERE user_id = '146' AND rec_status = 1 )
      AND rec_status = 1)
    AND rec_status = 1) 
  AND rec_status = 1);

Неактивен

 

#2 29.07.2012 12:33:12

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2420

Re: Помогите оптимизировать MySQL запрос

В mysql NOT IN зачастую плохо работает, перепишете запрос через JOIN'ы как минимум. Ключик на (user_id, rec_status) в таблице groups создайте, если нету еще.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 30.07.2012 11:35:23

Александр Трофимов
Завсегдатай
Откуда: Юрмала
Зарегистрирован: 19.09.2011
Сообщений: 95

Re: Помогите оптимизировать MySQL запрос

Первое, что хочется заметить — это то, что нет в запросе таблицы, которая определяет друзей и отбрасывает друзей друзей. Если такую таблицу ввести, что все становится проще. Предположим, что это таблица friends (user_id,friend_id).

SELECT
    friend_id
FROM
    friends
WHERE
    user_id='146'
    AND friend_id NOT IN (
        SELECT
            g2.user_id as friend_id
        FROM
            groups g
            JOIN groups g2 ON (g2.group_id=g.group_id)
        WHERE
            g.user_id='146'
            AND g.rec_status=1
    )


Как-то так. Запрос в скобках выбирает всех пользователей с которыми юзер 146 имеет общие группы со значением rec_status=1. Сам запрос выбирает из таблицы friends всех друзей юзера 146 и убирает всех друзей из запроса в скобках.
Можно посидеть и подумать над запросом без NOT IN через JOIN'ы, но не знаю на сколько быстро работает знак неравенства (!= или <>).

Неактивен

 

Board footer

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