我正在尝试确定查询具有大量数据的连接的两个表的最佳通用方法,其中每个表在 where 子句中都有一列。想象一个带有两个表的简单模式:
posts
id (int)
blog_id (int)
published_date (datetime)
title (varchar)
body (text)
posts_tags
post_id (int)
tag_id (int)
Run Code Online (Sandbox Code Playgroud)
具有以下索引:
posts: [blog_id, published_date]
tags: [tag_id, post_id]
Run Code Online (Sandbox Code Playgroud)
我们想要选择给定博客上标记为“foo”的 10 篇最新帖子。为便于讨论,假设该博客有 1000 万篇帖子,其中 100 万篇被标记为“foo”。查询此数据的最有效方法是什么?
天真的方法是这样做:
SELECT
id, blog_id, published_date, title, body
FROM
posts p
INNER JOIN
posts_tags pt
ON pt.post_id = p.id
WHERE
p.blog_id = 1
AND pt.tag_id = 1
ORDER BY
p.published_date DESC
LIMIT 10
Run Code Online (Sandbox Code Playgroud)
MySQL 将使用我们的索引,但最终仍会扫描数百万条记录。是否有更有效的方法来检索此数据而无需对架构进行非规范化?