Laravel执行SQL查询耗时久,Adminer中执行却极快的问题求助
Laravel查询慢于Adminer的排查建议
先纠正一个明显错误
你写的$khatma->reads->where('status_id',2)->count()是内存集合过滤,不是数据库查询:
$khatma->reads会先把该khatma关联的所有khatma_reads数据加载到PHP内存中- 后续的
where和count都是在内存中操作,数据量大时必然卡顿
正确写法应该用查询构造器:$khatma->reads()->where('status_id',2)->count(),让数据库层面完成统计。
排查步骤
对比实际执行的SQL:开启Laravel查询日志,查看最终生成的SQL是否和Adminer中完全一致
DB::enableQueryLog(); // 执行你的查询代码 dd(DB::getQueryLog());重点检查参数绑定后的类型(比如
khatma_id是字符串还是整数)、是否多了额外的WHERE条件,这可能导致索引失效。核对数据库连接配置:确认Laravel使用的数据库连接(
.env中DB_HOST、DB_PORT、DB_DATABASE等)和Adminer完全一致,避免连接到不同的数据库实例(比如一个本地一个远程,或读写分离的慢从库)。检查索引执行计划:在Laravel中执行EXPLAIN分析查询,对比Adminer的执行计划
$sql = 'SELECT status_id, COUNT(*) as row_count FROM khatma_reads WHERE khatma_id = ? AND status_id = 2 GROUP BY status_id'; dd(DB::select(DB::raw('EXPLAIN ' . $sql), [$khatma->id]));查看
key字段是否命中预期索引(比如khatma_id和status_id的联合索引),如果Laravel的查询未命中索引,大概率是参数类型不匹配导致的隐式转换。排除全局作用域干扰:如果
KhatmaRead模型定义了全局作用域,会自动给查询附加额外条件,可能拖慢查询。可以临时禁用全局作用域测试:DB::table('khatma_reads')->withoutGlobalScopes() ->where('status_id', 2) ->where('khatma_id', $khatma->id) ->count();检查连接开销与中间件:查看数据库慢日志,确认Laravel的查询是否真的在数据库层面耗时久;同时排查是否有请求中间件、模型观察者在查询前后执行了额外逻辑,增加了总耗时。
内容的提问来源于stack exchange,提问作者Q8root
相关产品推荐
相关产品推荐

