Улучшение моего запроса для получения сообщений на главной странице - занимает 0,5171 сек. - PullRequest
1 голос
/ 15 сентября 2011

Этот запрос выполняется очень медленно; Раньше это были 3 отдельных запроса, но я объединил их в 1. Я предполагаю, что он медленный из-за выполняемых подвыборов, но я предполагаю, что может быть лучший способ запросить эту информацию.

* Фон: *

users - это просто учетные записи пользователей.
posts - это все содержание сообщения.
posts_int - это всего лишь 2 поля: postid и intid. Это хранит идентификаторы интересов для сообщений.
int_usr - это всего лишь 2 поля: ID пользователя и Intid. Это хранит идентификаторы интересов для пользователей.

Все имена полей "intid" основаны на другой таблице, в которой просто есть идентификаторы и имена для каждого интереса. Этот запрос возвращает все сообщения для этого пользователя, которые имеют отношение к его выбранным интересам и хранятся в целых числах в int_usr.

Запрос:

SELECT DISTINCT 
users.first_name,
users.last_name,
posts.id,
posts.userid,
posts.comments,
posts.date,
posts.comment 
FROM posts 
LEFT JOIN users ON 
posts.userid = users.id 
LEFT JOIN posts_int ON 
posts.id = posts_int.postid 
WHERE 
posts_int.intid IN (
SELECT DISTINCT 
  intid 
FROM int_usr 
WHERE 
  intid IN (
      SELECT DISTINCT 
      intid 
       FROM int_usr 
       WHERE 
      userid = '1' 
  ) 
ORDER BY intid ASC 
)
AND posts.deleted = '0' 
AND users.deleted = '0' 
ORDER BY 
posts.id DESC 
LIMIT 0,12

Любая помощь приветствуется!

Ryan

РЕДАКТИРОВАТЬ: Вот объяснение, которое вы просили:

* ПОЯСНИТЕ SQL: *

+----+--------------------+-----------+--------+----------------+---------+---------+---------------------------+------+----------------------------------------------+
| id | select_type        | table     | type   | possible_keys  | key     | key_len | ref                       | rows | Extra                                        |
+----+--------------------+-----------+--------+----------------+---------+---------+---------------------------+------+----------------------------------------------+
|  1 | PRIMARY            | posts_int | ALL    | postid         | NULL    | NULL    | NULL                      |   87 | Using where; Using temporary; Using filesort |
|  1 | PRIMARY            | posts     | eq_ref | PRIMARY,userid | PRIMARY | 4       | bunchify.posts_int.postid |    1 | Using where                                  |
|  1 | PRIMARY            | users     | eq_ref | PRIMARY        | PRIMARY | 4       | bunchify.posts.userid     |    1 | Using where                                  |
|  2 | DEPENDENT SUBQUERY | int_usr   | ALL    | NULL           | NULL    | NULL    | NULL                      |  288 | Using where; Using temporary                 |
|  3 | DEPENDENT SUBQUERY | int_usr   | ref    | userid         | userid  | 4       | const                     |   19 | Using where; Using temporary                 |
+----+--------------------+-----------+--------+----------------+---------+---------+---------------------------+------+----------------------------------------------+
5 rows in set (0.00 sec)

Ответы [ 2 ]

3 голосов
/ 15 сентября 2011

Вы можете немного упростить ситуацию, избавившись от дополнительного уровня вложенности в

posts_int.intid IN (
SELECT DISTINCT 
  intid 
FROM int_usr 
WHERE 
  intid IN (
      SELECT DISTINCT 
      intid 
       FROM int_usr 
       WHERE 
      userid = '1' 
  ) 
ORDER BY intid ASC 
)

, а затем изменив левые объединения на внутренние объединения, потому что вы все равно проверяете правильные таблицы в предложении where.,Что-то вроде

SELECT DISTINCT <blah>
  FROM posts 
  JOIN users 
       ON posts.userid = users.id 
  JOIN posts_int 
       ON posts.id = posts_int.postid 
  JOIN int_usr 
       on posts_int.intid = int_usr.intid and int_usr.userid = '1'
 where posts.deleted = '0' 
   AND users.deleted = '0' 
ORDER BY posts.id DESC 
LIMIT 0,12
1 голос
/ 15 сентября 2011

Это должно работать быстрее

SELECT DISTINCT  users.first_name, users.last_name, users.fb_userid, users.fb_username, posts.id, posts.userid, posts.likes, posts.dislikes, posts.comments, posts.date, posts.youtube_id, posts.media_image, posts.link_title, posts.link_description, posts.link_url, posts.comment  
FROM posts  
LEFT JOIN users ON  posts.userid = users.id  
LEFT JOIN posts_int ON  posts.id = posts_int.postid  
WHERE  posts_int.intid IN (SELECT DISTINCT intid  
                           FROM int_usr  
                           WHERE userid = '1' 
                           ORDER BY intid ASC) AND posts.deleted = '0'  AND users.deleted = '0'  
ORDER BY  posts.id DESC  LIMIT 0,12 

Если это будет делать то, что, я надеюсь, должно быть, оно будет самым быстрым

SELECT DISTINCT  users.first_name, users.last_name, users.fb_userid, users.fb_username, posts.id, posts.userid, posts.likes, posts.dislikes, posts.comments, posts.date, posts.youtube_id, posts.media_image, posts.link_title, posts.link_description, posts.link_url, posts.comment  
FROM posts  
LEFT JOIN users ON  posts.userid = users.id  
LEFT JOIN posts_int ON  posts.id = posts_int.postid 
left join int_user ON  int_user.userid = posts.userid and int_user.intid = posts_int.intid and int_user.userid = '1' 
WHERE  posts_int.intid IN AND posts.deleted = '0'  AND users.deleted = '0'  
ORDER BY  posts.id DESC  LIMIT 0,12 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...