MySQL一对多条件查询只使用2个查询-为什么MyBatis不使用这个?坏吗?

MySQL一对多条件查询只使用2个查询-为什么MyBatis不使用这个?坏吗?,mysql,sql,database,Mysql,Sql,Database,假设经典示例:两个表blogs和posts,它们是one-to-many。我们想知道满足某些条件的博客(SELECT*FROM blog WHERE my_condition)以及与之相关的所有帖子 我的方式: 从博客中选择blog\u id、一些其他blog\u专栏,其中包含我的博客条件。然后提取所有信息,并将所有博客ID保存到一个数组中,例如列出博客ID 从blog\u id位于(?、、…、?)的帖子中选择post\u id、blog\u id和其他一些post\u列,其中?由列出blog\

假设经典示例:两个表
blogs
posts
,它们是
one-to-many
。我们想知道满足某些条件的博客(
SELECT*FROM blog WHERE my_condition
)以及与之相关的所有
帖子

我的方式:

  • 从博客中选择blog\u id、一些其他blog\u专栏,其中包含我的博客条件
    。然后提取所有信息,并将所有博客ID保存到一个数组中,例如
    列出博客ID
  • 从blog\u id位于(?、、…、?)的帖子中选择post\u id、blog\u id和其他一些post\u列
    ,其中
    列出blog\u id
    插入
  • 然后只需要两个查询,所有的东西都是用索引运行的,所以不是很快吗


    另一方面,我认为MyBatis的连接方法有一些缺点。方法:
    选择blog\u id、post\u id、blog中的一些其他blog\u列,以及blog中的一些其他post\u列,在我的条件下加入帖子。缺点:

  • 如果一个博客平均对应于
    k
    篇文章,则其他一些博客专栏会重复
    k
    次。如果这些列很大,那么我们就浪费了带宽和CPU
  • 需要执行
    JOIN
    ,这会降低速度并消耗服务器上宝贵的CPU

  • 所以我想知道为什么MyBatis会用这个?我的方法更好吗


    谢谢你的回复

    在mysql中,外部连接只存在于左侧或右侧,那么它是哪个呢?内部联接速度非常快,只要yoz在on列上有索引,并且内部联接将删除行。外部联接无法删除行,因此内部联接速度较慢,但我更希望子句中的联接方法不会快得多。只要不达到驱动程序限制,您的方式(使用
    (?,?,…,?)
    )就会运行。不能在列表中使用10000个值。驱动程序会施加一些限制,查询将崩溃。第一个是完全正确的,尽管在我的经验中,这种情况并不经常发生。第二个,不是;如果有正确的索引,即使行数很高,联接也可以非常有效。@fzyzcjy我不认为这通常是正确的。可能会有一些非常特殊的情况发生。我只在大型机被大量行压得喘不过气来,以至于程序必须求助于这些深奥的替代方案的情况下见过这种情况。但是,一般来说,连接是非常有效的。需要明确的是,您可以在MyBatis中使用第一种方法。MyBatis只是执行您编写的SQL。现在,如果有1000万个博客和10亿个帖子,我想1和2都表现不好。我会考虑首先检索一定数量的博客(比如1000或5000),最好是指定一系列索引列(例如<代码> ID在1和1000 ),而不是指定<代码>限制< /代码>和<代码>偏移< /代码>。然后在循环博客的同时获取每个博客的帖子。它需要的内存要少得多,而且比有那么多行时的查询数量更重要。