数据表有:
A:商品表
B:订单表
C:会员表
实现要求:
查询所有订单数据,数据会有每个订单下包含的商品信息和会员信息
方法1:
先查询所有订单信息,join关联会员表
得到的数据再foreach获取每个订单下的商品信息
方法2:
先select获取所有商品表、订单表、会员表信息
得到3个表的所有数据,再foreach得到最终数据
这2种方法哪个会快点,方法1多次查询数据库,方法2只3次查询数据库
数据表有:
A:商品表
B:订单表
C:会员表
实现要求:
查询所有订单数据,数据会有每个订单下包含的商品信息和会员信息
方法1:
先查询所有订单信息,join关联会员表
得到的数据再foreach获取每个订单下的商品信息
方法2:
先select获取所有商品表、订单表、会员表信息
得到3个表的所有数据,再foreach得到最终数据
这2种方法哪个会快点,方法1多次查询数据库,方法2只3次查询数据库
我来歪个楼,我感觉这种情况很少存在。 业务上一般会做分页。
第一种方案:
每次先找出一页的订单,然后foreach的去查会员和商品。
优点:数据量小,按需加载
缺点:单页的订单可能存在相同的订单或者会员,但是每次都需要再查询。如果商品,会员不是select* 的话,可以忽略,因为通过主键查找是很快的。
第二种方案:
这种方案需要自己写sql,或者框架自带join方法。
优点:每次会返回成型的数据,不需要再次查找
缺点:需要连表查询,效率会低一些。
有些mvc框架里面有viewmode这一层,做的就是这个工作,把数据筛选出来,然后再做整理。 其实我推荐用第一种方案。
建议分开查询,也就是方法2,方法1存在的问题:
group by
。但是方法2可以优化的地方是:假如你这功能是在后台列表页展示的,那么一般会查一定数量如20条的订单进行展示,可以进行如下处理:
select * from order limit 20;
,可以把其中的user_id
通过php处理出来存入数组$user_ids;select * from user where user_id in(之前查出来的$user_ids)
,就可以只获取这20个用户的信息了,订单商品同样道理;ps:稍大点的框架如laravel都是有这功能的, laravel里是叫模型关系,模型关系一旦定义好随处可用,不用再纠结这里写个join,那里写个on了,字段命名不规范的话还得看下表结构是xx_id还是xxx_id。
Laravel <=== 超好用框架,别被庞大性能差所蒙蔽~
4 回答1.8k 阅读✓ 已解决
8 回答1.4k 阅读
3 回答1.4k 阅读✓ 已解决
2 回答1.6k 阅读✓ 已解决
1 回答1.4k 阅读✓ 已解决
4 回答2.4k 阅读
3 回答1.2k 阅读✓ 已解决
mysql查询是在磁盘上面进行IO操作,php循环是在内存中进行,你的第一个方法的循环查询会慢一些。 如果数据库中数据量过大,内存占用过大,建议分片读取处理