请求将SQL转换为Laravel Eloquent,解决大数据量查询卡顿问题
Laravel Eloquent 转换与查询优化建议
一、SQL转Eloquent实现
对应你提供的SQL,Eloquent可以这样实现:
use App\Models\Chapter; // 假设模型类为Chapter,对应chapters表 $results = Chapter::select('id', 'file_id', 'server', 'chapter', 'data') ->where('server', 'sg') ->whereNotIn('chapter', function ($query) { $query->select('chapter') ->from('chapters as c2') ->where('server', 'hk') ->whereColumn('c2.file_id', 'chapters.file_id'); }) ->get();
二、大数据量查询优化建议
针对10万+数据的卡顿问题,原SQL的NOT IN子查询在数据量大时性能较差,建议改用左连接+空值判断的方式,同时添加索引提升效率:
1. 优化后的Eloquent写法
$results = Chapter::select('c1.id', 'c1.file_id', 'c1.server', 'c1.chapter', 'c1.data') ->from('chapters as c1') ->leftJoin('chapters as c2', function ($join) { $join->on('c1.file_id', '=', 'c2.file_id') ->where('c2.server', 'hk'); }) ->where('c1.server', 'sg') ->whereNull('c2.chapter') ->get();
2. 添加索引
在chapters表上创建复合索引,大幅提升查询速度:
CREATE INDEX idx_chapters_server_file_id ON chapters(server, file_id); CREATE INDEX idx_chapters_server_file_id_chapter ON chapters(server, file_id, chapter);
内容的提问来源于stack exchange,提问作者ThuMinh
相关产品推荐
相关产品推荐

