此处不做定论,在业务中测试之后使用
主表大于子表行数:
主表是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