联表一次查询和查询后循环内再查询别的表组装数据,哪个性能好呢?

timeless-zyg

问题描述

在后台列表一页只显示10条的情况下
联表查询:
关联所有需要的表一次查完
查询之后foreach循环内再查询别的表组装数据:
比如order先查10条,然后foreach循环的时候再查询用户表、商品表、地址表等等

以上两种方式那种性能好点呢?

369 7 2
7个回答

xiaoming

with ?

nitron

抛开具体总量谈没什么意义,两种都可以
理论上,索引建得好,订单表量少第一种,量大第二种

注意:理论上

张文远

方案一:foreach循环查询用户表、商品表等,肯定是最差的,循环中多次查询不可取。
方案二:优化成先查订单,再拿订单id去in语法一次查出对应的用户、商品数据,再手动组装。这种方式就是关联模型的处理方案,实现方式是分开多次查的,用的in 语法。
使用多次查询会走更多的IO,效率相对来说较低。
方案三:join连表的话一次查询返回,这种执行的sql效率高,但是sql服务压力大。
如果是我,我会使用使用方案二:
1.SQL语句比较简单,可以用关联模型轻松实现,相比join心智负担更少;
2.现在程序的瓶颈往往不在编程语言而在数据库,尽量减轻单次数据库的操作,用程序去控制。

  • timeless-zyg 12天前

    跑了下 这三种查询方式 综合下来第二种速度快点

liziyu

有的团队明确要求尽量不联表,推荐单独查出来后再组装。

  • 暂无评论
army

我们是不允许使用联表查询的,只能用简单的查询语句。
这种场景我们是这样的, 查询order列表,用foreach去便利查询结果得到所有其他表所需的id,
再用or去查询用户表、商品表、地址表,也就是总共只需要4条sql

        $orderArr = DB::find('order', $cond, array('id' => -1), $page, 10);
        $order_ids = [];
        $user_ids = [];
        foreach ($orderArr as $v) {
            $order_ids[] = $v['id'];
            $user_ids[] = $v['user_id'];
        }
        // 抢单列表
        $robinArr = DB::find('order_robin', array('order_id' => $order_ids), array(), 1, 500);
        // 用户数据
        $userArr = DB::find('user', array('id' => array_unique($user_ids)));
        // 用户头像
        $avatarArr = DB::find('user_avatar', array('user_id' => array_unique($user_ids)));
  • army 12天前

    至于为什么要用or不是in,自己测试

  • muyu 11天前

    没看到哪里用or代替in的啊

  • 释永战 5天前

    OR可以用到索引,用IN就不能使用索引了

  • muyu 4天前

    开什么玩笑,id一般都是主键,你无论是or还是in都走的索引,区别就是需不需要回表获取其他数据~

wgole

主要看数据量的大小,如果数据比较大:
1、foreach方式最优先pass,这种效率最低;
2、用join的话表数量太多或者索引设置不对,效率也大大降低;
3、用in的话,in的数量太大效率也下降很快;

我的解决方案是:
创建临时表 create temporary table,先把需要连表查询的id列表查出来,然后再把id列表存到临时表,然后用临时表join其他表查询,而且当前进程处理完,php回收机制自动释放该临时表。

  • 暂无评论
TM

数据多可以查出数据后根据订单标识In后续数据再进行php自己遍历整合会好点吧

  • 暂无评论
×
🔝