You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 22:41:19