Блокировка друзей sql (супер медленный sql ??) - PullRequest
0 голосов
/ 20 февраля 2011

Привет, у меня проблемы с этим sql.В основном он отображает статусы, которые опубликовали мои друзья, и отфильтровывает друзей, которых я заблокировал.

sql является slooooowwwwwww, хотя .. Требуется 2 секунды, чтобы обработать это.В чем проблема.(я перечислил таблицы и некоторые примеры того, как это выглядит ниже SQL) заранее спасибо!Sql ....

SELECT from_user_id,content,wall.date, wall.wall_type, users.id, users.displayname 
            FROM wall

            INNER JOIN friendship ON ( wall.from_user_id =friendship.user_a OR wall.from_user_id = friendship.user_b ) 
            INNER JOIN users ON (wall.from_user_id = users.id)WHERE users.id not in (select blocked_id from blocklist where user_id = 1) and (wall.wall_type = 'home' OR wall.wall_type = 'profile' or wall.wall_type = 'topro') AND (
                  (friendship.user_a = 1 and friendship.user_b = wall.from_user_id)
                or  
                    (friendship.user_a = wall.from_user_id and friendship.user_b = 1)    or (wall.user_id_of_wall = 1 or type_id = 1 or from_user_id = 1))GROUP BY wall_id ORDER BY date DESC LIMIT 10 

(имя таблицы: блок-лист)

    user_id | blocked_id
        1     74
        1     70
        1     94
        1     81

(имя таблицы: дружба)

user_a   user_b status  date
1        93         1   1297323354
1        79         1   1297323409
1        81         1   1297323403
1        82         1   1297323398
1        85         1   1297323389
1        90         1   1297323367
1        89         1   1297323373

(имя таблицы: пользователи)

       id   displayname
        1   Kenny  Jack
        8   Wale Robinson
        7   Victor WIlliams
        6   Micheal Harris
        9   Micheal Boston
        10  Yestor Smith

настенный стол

wall_id wall_type   user_id_of_wall   type_id   from_user_id    content      viewed   date
   5    profile        8                    8          8         Just chilling! 0   1296858001

СПАСИБО !!!

Ответы [ 2 ]

2 голосов
/ 20 февраля 2011

NOT IN используется для фиксированных значений, вместо этого используйте NOT EXISTS:

SELECT from_user_id,content,wall.date, wall.wall_type, users.id, users.displayname 
            FROM wall

            INNER JOIN friendship ON ( wall.from_user_id =friendship.user_a OR wall.from_user_id = friendship.user_b ) 
            INNER JOIN users ON (wall.from_user_id = users.id)
WHERE not exists (select * from blocklist where users.id = blocked_id AND user_id = 1) and wall.wall_type IN ('home', 'profile', 'topro') AND (
                  (friendship.user_a = 1 and friendship.user_b = wall.from_user_id)
                or  
                    (friendship.user_a = wall.from_user_id and friendship.user_b = 1)    or (wall.user_id_of_wall = 1 or type_id = 1 or from_user_id = 1))
GROUP BY wall_id
ORDER BY date DESC LIMIT 10 

[EDIT] Используйте IN для фиксированных значений (wall_type) ...

0 голосов
/ 01 марта 2011

всегда используйте WITH (NOLOCK) в запросах только для чтения!

также, пожалуйста, удалите весь свой параграф в предложении JOIN, вы скопировали и вставили его из MS Access?

...