Скорее всего, MySQL сначала будет использовать индекс (blog_id, published_date)
для сканирования всех строк, удовлетворяющих условию blog_id = 1
, начиная со строки с самым новым published_date
. Для этого нужно просто отсканировать назад по указателю, начиная с нужного места. Для каждой строки он должен присоединиться к таблице posts_tags
. На данный момент известны как tag_id
, так и post_id
, так что это просто поиск в первичном индексе, чтобы увидеть, существует ли строка. В 10% строк есть тег foo
, поэтому в среднем в posts
около 100 строк
таблица должна быть проверена до того, как будут найдены первые 10 строк набора результатов.
Я ожидаю, что отправленный вами запрос будет выполняться довольно быстро, если тег foo
является общим. Я не думаю, что он проверит миллионы строк - возможно, несколько сотен или несколько тысяч, если вам не повезет. Как только он нашел 10 подходящих строк, он может остановиться, не проверяя больше строк.
С другой стороны, если вы выберете тег, у которого менее 10 вхождений, он будет медленным, поскольку ему придется сканировать все строки в этом блоге.
Есть ли у вас показатели производительности, показывающие, что запрос выполняется особенно медленно, даже если часто встречается тег, который вы ищете? Можете ли вы опубликовать вывод EXPLAIN
для запроса?