V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
monsterj
V2EX  ›  问与答

mysql,级联查询,还是单表多次查询(对于查出多条数据来说)?

  •  
  •   monsterj · 2018-06-11 10:10:02 +08:00 · 2233 次点击
    这是一个创建于 2167 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想到 3 种查询方案,假如有 A、B 两个表,会查出 100 条数据
    1、A、B 表级联查询
    2、先查询 A 表,得到一个集合,然后遍历这个集合,用单条数据中的某个属性去查询 B 表,再把查询出来的结果插到这单条数据里
    3、先查询 A 表,得到一个集合 X,然后遍历这个集合 X,取出每个单条数据里的某个属性组成 in(),去查询 B 表得到集合 Y,然后把集合 Y 的数据对应插入到集合 X 里
    第 1 种只查询 1 条 sql,第 2 种要查询 101 条 sql,第 3 种查询 2 条 sql,大家用哪种方案?
    如果是更大的数据量呢

    5 条回复    2018-06-11 12:32:01 +08:00
    glacer
        1
    glacer  
       2018-06-11 10:48:29 +08:00   ❤️ 1
    让数据库做行遍历少的 join 是可以的,尤其是能做到小表驱动时。剩余的情况更倾向于单表多次查询。
    像 GraphQL 这类查询语言,其原生版本就不支持多表的 join 查询。即使 join-monster 这样的中间件,其底层实现 join 的技术也有两种。其官方文档里也明确在一对一级联(或少量数据级联)的情况下可使用 join 查询,而在多对多级联则建议使用单表 batch 查询。
    如果你们的数据库在后期会做水平分库的话,不管是使用 proxy 还是数据库中间件,对 join 查询的支持都不好(分布式数据库对 join 查询是很不友好的)。所以如果前期尽量避免 join 的使用的话会省很多事情。
    另外,单表多次查询可以对查询的中间结果缓存,这对 join 来说是很难做到的。
    monsterj
        2
    monsterj  
    OP
       2018-06-11 11:36:28 +08:00
    @glacer 那单表多次查询的话,第二种和第三种,哪个好一些
    monsterj
        3
    monsterj  
    OP
       2018-06-11 11:39:30 +08:00
    @glacer in()里的数据多了影响性能,但第二种 sql 又太多
    glacer
        4
    glacer  
       2018-06-11 12:06:47 +08:00
    @monsterj 第三种。第二种方法会发送大量 SQL,造成 N+1 问题。
    我不明白你所说的「 in()里的数据多了影响性能」是否有论据。使用 in 也是可以命中索引的,性能并不会比 join 差多少。
    janssenkm
        5
    janssenkm  
       2018-06-11 12:32:01 +08:00 via Android
    @glacer 有索引好些,没索引什么库都是渣
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   976 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 22:07 · PVG 06:07 · LAX 15:07 · JFK 18:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.