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

2018-06-11 10:10:02 +08:00
 monsterj

想到 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,大家用哪种方案?
如果是更大的数据量呢

2304 次点击
所在节点    问与答
5 条回复
glacer
2018-06-11 10:48:29 +08:00
让数据库做行遍历少的 join 是可以的,尤其是能做到小表驱动时。剩余的情况更倾向于单表多次查询。
像 GraphQL 这类查询语言,其原生版本就不支持多表的 join 查询。即使 join-monster 这样的中间件,其底层实现 join 的技术也有两种。其官方文档里也明确在一对一级联(或少量数据级联)的情况下可使用 join 查询,而在多对多级联则建议使用单表 batch 查询。
如果你们的数据库在后期会做水平分库的话,不管是使用 proxy 还是数据库中间件,对 join 查询的支持都不好(分布式数据库对 join 查询是很不友好的)。所以如果前期尽量避免 join 的使用的话会省很多事情。
另外,单表多次查询可以对查询的中间结果缓存,这对 join 来说是很难做到的。
monsterj
2018-06-11 11:36:28 +08:00
@glacer 那单表多次查询的话,第二种和第三种,哪个好一些
monsterj
2018-06-11 11:39:30 +08:00
@glacer in()里的数据多了影响性能,但第二种 sql 又太多
glacer
2018-06-11 12:06:47 +08:00
@monsterj 第三种。第二种方法会发送大量 SQL,造成 N+1 问题。
我不明白你所说的「 in()里的数据多了影响性能」是否有论据。使用 in 也是可以命中索引的,性能并不会比 join 差多少。
janssenkm
2018-06-11 12:32:01 +08:00
@glacer 有索引好些,没索引什么库都是渣

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/462063

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX