*** 注意:该办法适用于没办法使用跨库软连接或者中间件的情况
有些经验的都知道,mysql在in大量数据时会出现不走索引的现象,查了很多资料,解决办法主要是将in改为join,但是实际业务中可能会出现从其他库查过来的大量id,例如A库查到老师下面所有的学生id,B库根据学生id去查询统计做题信息等等。
由于同一个请求中会有很多维度数据需要统计,所以我的办法是在最开始创建一个内存临时表,然后后续的所有相关查询把in改成和该临时表的关联查询。
具体代码如下: laravel上执行
/**
* 使用临时表关联
* @param $arr array in的id数组
*/
public function tempTableQuery($arr)
{
DB::select('drop table if exists temp_tb ');
DB::select('CREATE TEMPORARY TABLE temp_tb(uid int not null default 0)');
$sql = '';
foreach ($arr as $v){
$sql.='('.$v.'),';
}
$sql = rtrim($sql,',');
DB::select(sprintf('insert into temp_tb(uid) values %s',$sql));
$res = DB::select('SELECT COUNT(*) AS tp_count FROM temp_tb left join `practice_answer`
on practice_answer.uid = temp_tb.uid limit 1');
echo json_encode($res);
}