2015-08-07 5 views
0

Две таблицы, первая из которых является пользователями, а вторая - сообщениями, структура столбцов составляет id,body,parent_id,user_id в этой таблице, все сообщения вставляются с parent_id, равно NULL, и если это комментарий parent_id установлено значение post id.Mysql php count номер внутреннего соединения работает быстрее с подзапросами

То, что я пытаюсь сделать, это присоединиться к таблице пользователей - получить информацию о пользователе и получить количество комментариев к каждому сообщению.

Я попробовал несколько запросов

select p.id, 
     users.id as 'from_id', 
     users.fullname as 'from_fullname', 
     users.role as 'from_role', 
     users.picture as 'from_picture', 
     p.body, 
     p.time_posted as 'time_posted', 
     p.attachment, 
     p.parent_id, 
     count(c.id) as counts 
from 
    wall p 
join 
    users on users.id = p.user_id 
left join 
    wall c on c.parent_id = p.id 
where 
    p.class_id = 8 and p.parent_id is null 
group by 
    p.id 
order by 
    `counts` ---->EXPLAIN RESULTS 

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE p ref PRIMARY,parent_id,class_id,user_id parent_id 5 const 49920 Using index condition; Using where; Using temporary; Using filesort 
1 SIMPLE users eq_ref PRIMARY PRIMARY 4 ischool.p.user_id 1 NULL 
1 SIMPLE c ref parent_id parent_id 5 ischool.p.id 49920 Using index 

Это один занимает в среднем около 2,7 секунды до завершения.

Хотя моя вторая попытка

select p.id, 
     users.id as 'from_id', 
     users.fullname as 'from_fullname', 
     users.role as 'from_role', 
     users.picture as 'from_picture', 
     p.body, 
     (select count(*) from wall where parent_id= p.id) as comments_count, 
     p.time_posted as 'time_posted', 
     p.attachment, 
     p.parent_id 
from 
    wall p 
left join 
    users on users.id = p.user_id 
where 
    p.class_id = 8 and p.parent_id is NULL 
order by 
    p.id DESC; --->Explain results 

id select_type table type possible_keys key key_len ref rows Extra 
1 PRIMARY p ref parent_id,class_id parent_id 5 const 49920 Using where 
1 PRIMARY users eq_ref PRIMARY PRIMARY 4 ischool.p.user_id 1 NULL 
2 DEPENDENT SUBQUERY wall ref parent_id parent_id 5 ischool.p.id 49920 Using index 

Этот запрос занимает 1,4 секунд, чтобы завершить

учитывая, что им с использованием MYSQL InnoDB с индексом на всех и каждого столбца идентификаторов.

  1. так что есть лучший способ для получения сообщений и комментариев?
  2. Почему подзапрос работает почти в 2 раза быстрее, чем соединение?
+1

Каждый раз, когда вы хотите узнать что-либо о выполнении запроса, вы должны начать с Поясните, и собственно DDL, для всех соответствующих таблиц. – Strawberry

+0

@Strawberry yp сделал это, точно не понял, что объяснил, возвратил, я отредактирую вопрос с результатом – Zalaboza

+0

Конечно, в большинстве случаев соединение будет быстрее, чем подзапрос, особенно внутреннее соединение, в подзапросе mysql будет извлекать все строки в каждой основной итерации запроса, затем затем фильтровать его по основному запросу, в то время как запрос соединения напрямую фильтрует строки и извлекает только строки, которые проходят фильтр. – VMcreator

ответ

-2

В основном соединения являются более быстрыми, чем суб-запрос. Как правило, новый разработчик предпочитает использовать подзапрос.

План выполнения запроса может повлиять на производительность. Почти все запросы запросов к запросам быстрее, чем подзапрос.

Основное отличие заключается в том, что запрос запроса выполняет запрос и загружает все данные и на основе этих данных выполняет другой запрос.

и объединения всех таблиц загружаются с данными, поэтому он выполняет быстрое выполнение запроса.

В вашем запросе, если вы хотите показать, почему ваш запрос является более быстрым, чем соединение, используйте команду «объяснять», чтобы показать, как выполняется запрос.

Эти ссылки могут полезно понимать понятия: http://www.chrislondon.co/joins-vs-subqueries/ http://www.sitepoint.com/using-explain-to-write-better-mysql-queries/

+0

ehhm, я уже сделал и опубликовал результат объяснения. Я не вижу, как вы отвечаете на все. – Zalaboza

+0

Это слишком упрощенно, чтобы быть полезным или истинным. – Strawberry

+0

@Strawberry/Zalaboza: это не моя вина, что вы отправили одно сообщение в одно и то же время, и у вас нет прав, которые не отрицаются и дают отрицательный голос на мой ответ. –

Смежные вопросы