mysql关于in大量数据的解决办法

*** 注意:该办法适用于没办法使用跨库软连接或者中间件的情况

有些经验的都知道,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);

    }

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值