Почему MySQL сортируется по mp.id в этом плане выполнения запроса?MySql

Форум по Mysql
Ответить
Anonymous
 Почему MySQL сортируется по mp.id в этом плане выполнения запроса?

Сообщение Anonymous »

Я запускаю следующий SQL-запрос в MySQL 8.0: < /p>
SELECT mp.id
FROM meme_post mp
JOIN meme_post_tag mpt ON mp.id = mpt.meme_post_id
WHERE deleted_at IS NULL AND mp.media_type = 'STATIC' AND mpt.tag_id IN (11, 30, 24) -- Selected tag IDs
GROUP BY mp.id
HAVING COUNT(DISTINCT mpt.tag_id) = 3
ORDER BY mp.created_at DESC
LIMIT 21 OFFSET 0;
< /code>
Объяснение вывода: < /p>
1 SIMPLE mp ref PRIMARY,FK_meme_post_user,idx_deleted_at_created_at idx_deleted_at_created_at 9 const 166682 50.00 Using index condition; Using where; Using temporary; Using filesort
1 SIMPLE mpt ref idx_meme_post_tag_post_tag,FK_meme_post_tag_tag,FK_meme_post_tag_post_id idx_meme_post_tag_post_tag 8 findmymeme_db.mp.id 2 75.35 Using where; Using index
< /code>
и сведения о плане выполнения: < /p>
-> Limit: 21 row(s) (actual time=1571..1571 rows=21 loops=1)
-> Sort: mp.created_at DESC (actual time=1571..1571 rows=21 loops=1)
-> Filter: (`count(distinct mpt.tag_id)` = 3) (actual time=802..1566 rows=8238 loops=1)
-> Stream results (cost=182898 rows=333364) (actual time=802..1556 rows=219023 loops=1)
-> Group aggregate: count(distinct mpt.tag_id) (cost=182898 rows=333364) (actual time=802..1411 rows=219023 loops=1)
-> Nested loop inner join (cost=145301 rows=375967) (actual time=802..1343 rows=322453 loops=1)
-> Sort: mp.id (cost=11577 rows=166682) (actual time=802..832 rows=249318 loops=1)
-> Filter: (mp.media_type = 'STATIC') (cost=11577 rows=166682) (actual time=0.206..642 rows=249318 loops=1)
-> Index lookup on mp using idx_deleted_at_created_at (deleted_at=NULL), with index condition: (mp.deleted_at IS NULL) (cost=11577 rows=166682) (actual time=0.204..615 rows=332220 loops=1)
-> Filter: (mpt.tag_id IN (11,30,24)) (cost=1.01 rows=2.26) (actual time=0.0015..0.00191 rows=1.29 loops=249318)
-> Covering index lookup on mpt using idx_meme_post_tag_post_tag (meme_post_id=mp.id) (cost=1.01 rows=2.99) (actual time=0.00129..0.00169 rows=3 loops=249318)
< /code>
Дополнительная информация:
index idx_meme_post_tag_post_tag уникальна (meme_post_id, Tag_id).
Мой вопрос:
Я заметил, что mysql сортируется по mp. идентификатор. Однако, начиная с MySQL 8.0, группа больше не косвенно сортирует результаты. Тогда почему MySQL все еще сортируется? Таблица MPT индексируется и хранится в порядке MEME_POST_ID, и, поскольку мы выполняем соединение с MP, MySQL Sorts MP.ID для оптимизации вложенного соединения цикла. < /P>
Это правильно? MySQL выбирает сортировку mp.id явно для повышения эффективности вложенного соединения цикла?>

Подробнее здесь: https://stackoverflow.com/questions/794 ... ution-plan
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «MySql»