求助,这2种查询方法,哪个速度会快点?

数据表有:
A:商品表
B:订单表
C:会员表

实现要求:
查询所有订单数据,数据会有每个订单下包含的商品信息和会员信息

方法1:
先查询所有订单信息,join关联会员表
得到的数据再foreach获取每个订单下的商品信息

方法2:
先select获取所有商品表、订单表、会员表信息
得到3个表的所有数据,再foreach得到最终数据

这2种方法哪个会快点,方法1多次查询数据库,方法2只3次查询数据库

阅读 2.8k
4 个回答

mysql查询是在磁盘上面进行IO操作,php循环是在内存中进行,你的第一个方法的循环查询会慢一些。 如果数据库中数据量过大,内存占用过大,建议分片读取处理

我来歪个楼,我感觉这种情况很少存在。 业务上一般会做分页。
第一种方案:
每次先找出一页的订单,然后foreach的去查会员和商品。
优点:数据量小,按需加载
缺点:单页的订单可能存在相同的订单或者会员,但是每次都需要再查询。如果商品,会员不是select* 的话,可以忽略,因为通过主键查找是很快的。
第二种方案:
这种方案需要自己写sql,或者框架自带join方法。
优点:每次会返回成型的数据,不需要再次查找
缺点:需要连表查询,效率会低一些。

有些mvc框架里面有viewmode这一层,做的就是这个工作,把数据筛选出来,然后再做整理。 其实我推荐用第一种方案。

数据量小用join查,数据大还是分开查询然后foreach拼装数据吧

建议分开查询,也就是方法2,方法1存在的问题:

  1. 循环查sql是效率很低下的做法。
  2. 如果订单是多个商品的还需要group by
  3. 以后数据量大了拆表join语句比较麻烦。
  4. 不便于阅读,后期再加个订单使用的优惠什么的一对多的表join起来看着头大。

但是方法2可以优化的地方是:假如你这功能是在后台列表页展示的,那么一般会查一定数量如20条的订单进行展示,可以进行如下处理:

  1. 首先select * from order limit 20;,可以把其中的user_id通过php处理出来存入数组$user_ids;
  2. select * from user where user_id in(之前查出来的$user_ids),就可以只获取这20个用户的信息了,订单商品同样道理;
  3. 页面展示时用数组下标取到对应user_id的信息进行展示即可。

ps:稍大点的框架如laravel都是有这功能的, laravel里是叫模型关系,模型关系一旦定义好随处可用,不用再纠结这里写个join,那里写个on了,字段命名不规范的话还得看下表结构是xx_id还是xxx_id。
Laravel <=== 超好用框架,别被庞大性能差所蒙蔽~

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