Две таблицы, первая из которых является пользователями, а вторая - сообщениями, структура столбцов составляет 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 с индексом на всех и каждого столбца идентификаторов.
- так что есть лучший способ для получения сообщений и комментариев?
- Почему подзапрос работает почти в 2 раза быстрее, чем соединение?
Каждый раз, когда вы хотите узнать что-либо о выполнении запроса, вы должны начать с Поясните, и собственно DDL, для всех соответствующих таблиц. – Strawberry
@Strawberry yp сделал это, точно не понял, что объяснил, возвратил, я отредактирую вопрос с результатом – Zalaboza
Конечно, в большинстве случаев соединение будет быстрее, чем подзапрос, особенно внутреннее соединение, в подзапросе mysql будет извлекать все строки в каждой основной итерации запроса, затем затем фильтровать его по основному запросу, в то время как запрос соединения напрямую фильтрует строки и извлекает только строки, которые проходят фильтр. – VMcreator