mysql内层查询方式比较

                    此处不做定论,在业务中测试之后使用

主表大于子表行数:

主表是student 160万行时 子表是student_school 50万行 比whereIn方式高出300倍

whereExists

  $relation->whereExists( function ($query) use ($request) {

      $query->from((new StudentSchool)->getTable())->whereIn('sch_id', getValidSch($request->s_t_id, $request->login_sch_ids))->select('stu_id')->whereRaw(class_id=o_t_m_id);

  });

whereIn

  $relation->whereIn('student_id' ,function ($query) use ($request) {

      $query->from((new StudentSchool)->getTable())->whereIn('sch_id', getValidSch($request->s_t_id, $request->login_sch_ids))->select('stu_id');

  });

主表小于子表行数:

主表是class_manage 2.5万 行时 class_schedule 13万 行时 比whereIn方式高出count(*)效率相近,列表查询高于2倍

whereExists

$relation->whereExists( function ($query) use ($request) {

      $query->from((new classSchedule)->getTable())->whereIn('class_id', getValidSch($request->s_t_id, $request->login_sch_ids))->select('class_id')->whereRaw(class_id=o_t_m_id);

  });

whereIn

$relation->whereIn('o_c_m_id' ,function ($query) use ($request) {

      $query->from((new classSchedule)->getTable())->whereIn('class_id', getValidSch($request->s_t_id, $request->login_sch_ids))->select('class_id');

  });

总结:效率由优到次 whereExists > whereIn > has > whereHas

主表与子表行数接近:

主表是fee 13万行时,子表fee_task_school 11万时 在有分页的情况列查询exists高于in方式10倍。

在计算总数时(即无分页) extist方式低于in 方式4倍。

whereExists

$relation->whereExists(function($query) use($request){

      $query->from((new FeeTaskSchool)->getTable())

              ->whereIn('st_id',$request->login_sch_ids)

              ->whereRaw('ft_id=fee_id')

              ->select('ft_id');

  });

whereIn

  $relation->whereIn('fee_id',function($query) use($request){

      $query->from((new FeeTaskSchool)->getTable())->whereIn('st_id',$request->login_sch_ids)->select('ft_id');

  });

总结:此次测试即便使得分页extist高于in方式很多倍,但在本次两表都是10万+行数时,计算总量时in方式高于extist4倍多,然实际列表都在计算总量。

extist count() 平均400 + list 平均15 总消耗415

in cont(

) 平均110+ list平均 115 总消耗225

你可能感兴趣的:(mysql内层查询方式比较)