在后台列表一页只显示10条的情况下 联表查询: 关联所有需要的表一次查完 查询之后foreach循环内再查询别的表组装数据: 比如order先查10条,然后foreach循环的时候再查询用户表、商品表、地址表等等
以上两种方式那种性能好点呢?
with ?
没太用过
抛开具体总量谈没什么意义,两种都可以 理论上,索引建得好,订单表量少第一种,量大第二种
注意:理论上
弄了点测试数据 第二种查询速度快点
方案一:foreach循环查询用户表、商品表等,肯定是最差的,循环中多次查询不可取。 方案二:优化成先查订单,再拿订单id去in语法一次查出对应的用户、商品数据,再手动组装。这种方式就是关联模型的处理方案,实现方式是分开多次查的,用的in 语法。 使用多次查询会走更多的IO,效率相对来说较低。 方案三:join连表的话一次查询返回,这种执行的sql效率高,但是sql服务压力大。 如果是我,我会使用使用方案二: 1.SQL语句比较简单,可以用关联模型轻松实现,相比join心智负担更少; 2.现在程序的瓶颈往往不在编程语言而在数据库,尽量减轻单次数据库的操作,用程序去控制。
跑了下 这三种查询方式 综合下来第二种速度快点
有的团队明确要求尽量不联表,推荐单独查出来后再组装。
我们是不允许使用联表查询的,只能用简单的查询语句。 这种场景我们是这样的, 查询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)));
至于为什么要用or不是in,自己测试
没看到哪里用or代替in的啊
OR可以用到索引,用IN就不能使用索引了
开什么玩笑,id一般都是主键,你无论是or还是in都走的索引,区别就是需不需要回表获取其他数据~
主要看数据量的大小,如果数据比较大: 1、foreach方式最优先pass,这种效率最低; 2、用join的话表数量太多或者索引设置不对,效率也大大降低; 3、用in的话,in的数量太大效率也下降很快;
我的解决方案是: 创建临时表 create temporary table,先把需要连表查询的id列表查出来,然后再把id列表存到临时表,然后用临时表join其他表查询,而且当前进程处理完,php回收机制自动释放该临时表。
数据多可以查出数据后根据订单标识In后续数据再进行php自己遍历整合会好点吧
with ?
没太用过
抛开具体总量谈没什么意义,两种都可以
理论上,索引建得好,订单表量少第一种,量大第二种
注意:理论上
弄了点测试数据 第二种查询速度快点
方案一:foreach循环查询用户表、商品表等,肯定是最差的,循环中多次查询不可取。
方案二:优化成先查订单,再拿订单id去in语法一次查出对应的用户、商品数据,再手动组装。这种方式就是关联模型的处理方案,实现方式是分开多次查的,用的in 语法。
使用多次查询会走更多的IO,效率相对来说较低。
方案三:join连表的话一次查询返回,这种执行的sql效率高,但是sql服务压力大。
如果是我,我会使用使用方案二:
1.SQL语句比较简单,可以用关联模型轻松实现,相比join心智负担更少;
2.现在程序的瓶颈往往不在编程语言而在数据库,尽量减轻单次数据库的操作,用程序去控制。
跑了下 这三种查询方式 综合下来第二种速度快点
有的团队明确要求尽量不联表,推荐单独查出来后再组装。
我们是不允许使用联表查询的,只能用简单的查询语句。
这种场景我们是这样的, 查询order列表,用foreach去便利查询结果得到所有其他表所需的id,
再用or去查询用户表、商品表、地址表,也就是总共只需要4条sql
至于为什么要用or不是in,自己测试
没看到哪里用or代替in的啊
OR可以用到索引,用IN就不能使用索引了
开什么玩笑,id一般都是主键,你无论是or还是in都走的索引,区别就是需不需要回表获取其他数据~
主要看数据量的大小,如果数据比较大:
1、foreach方式最优先pass,这种效率最低;
2、用join的话表数量太多或者索引设置不对,效率也大大降低;
3、用in的话,in的数量太大效率也下降很快;
我的解决方案是:
创建临时表 create temporary table,先把需要连表查询的id列表查出来,然后再把id列表存到临时表,然后用临时表join其他表查询,而且当前进程处理完,php回收机制自动释放该临时表。
数据多可以查出数据后根据订单标识In后续数据再进行php自己遍历整合会好点吧