mysql 查询效率疑问

现有两张表
活动表 activity
用户表 user
两表通过user_id字段相互关联
先要获取活动列表且活动列表要附带用户信息

是 select activity join user 呢
还是 res = select activity

for {
  res['user'] = select user
} 

效率上两者会差很多吗?
默认有连接池存在

补充一个疑问
从数据结构角度来讲
一个活动数据的结构中直接混杂用户表的信息好呢还是res['user'] = userdata 好呢?

阅读 2.9k
4 个回答

从来不建议用join,会有很多不可预期的问题,而且不好优化,建议分开查询,先查activity,然后查出user_ids, 然后去查user信息,merge到activity上面,就ok了,这样写好处很多,最大好处就是逻辑清晰,易于维护。 再,请慎用join

如果单纯从效率来说:用join的会好点,只发送一次sql,如果用第二种,会发送多次sql。你自己可以测试下。
有些情况下是没有办法使用join的,比如分库分表情况,但不能说从来不建议使用join。使用第二种方式,也可以简单优化下,把查出来的用户信息缓存下,再次查询的时候如果缓存里有,就从里面取,不需要再次访问数据库。

说从来不用join的同学,考虑过select activity 如果返回100条记录,查询100次数据库的时间吗?如果是1000条呢?这个就是ORM框架中典型的N+1问题,一般是通过缓存来解决性能问题的,但并不是说这么做就是最好的。

如果你的数据库估不是计动不动就几千万的记录,join无论是开发效率还是运行效率,都比自己写循环单独写高效的多,所以一般情况下建议使用join的写法。

如果数据量不大的话,是可以使用join的。

用小表去join大一点的表。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题