小编New*_*ewt的帖子

在 MySQL 中,如何加入两个在 WHERE 条件下都有列的非常大的表?

我正在尝试确定查询具有大量数据的连接的两个表的最佳通用方法,其中每个表在 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 将使用我们的索引,但最终仍会扫描数百万条记录。是否有更有效的方法来检索此数据而无需对架构进行非规范化?

mysql optimization join

5
推荐指数
1
解决办法
8224
查看次数

标签 统计

join ×1

mysql ×1

optimization ×1