phpMyAdmin 不显示 Laravel “正在运行”查询,因其仅反映 MySQL 当前 SHOW PROCESSLIST 快照;Laravel 查询执行完即释放连接,所谓“阻塞”多在应用层(如队列、中间件或外部 API 卡顿),非 MySQL 真实长查询。
phpMyAdmin 本身不维护连接状态快照,它只显示当前 SHOW PROCESSLIST 的结果——而 Laravel 的查询一旦执行完(哪怕后续逻辑卡在 PHP 层、Redis 或外部 API),MySQL 连接早就释放了。你看到的“阻塞”,大概率是 Laravel 应用层没返回响应,不是 MySQL 正在跑长查询。
所以别急着在 phpMyAdmin 里点“Kill”,先确认问题真在数据库侧:
SHOW PROCESSLIST)State 列为 Sending data、Copying to tmp table、Locked 或持续 Query 状态超过 10 秒的行Sleep,说明 MySQL 没事,问题在 Laravel 的队列、中间件、或前端请求超时重试确认是真实阻塞后,必须用 KILL 命令,但不能乱杀。Laravel 默认用短连接(每次请求新建),所以查到的 ID 是瞬时的,要快准狠:
KILL ID)KILL 12345(把 12345 换成 Id 列数值)KILL QUERY ID:它只中断当前语句,但 Laravel 可能立刻重试;KILL ID 才真正断开连接,强制 Laravel 报 MySQL server has gone away 错误并退出该请求php artisan queue:work),它会自动重启,但记得检查 failed_jobs 表治标不如治本。Laravel 里最常触发阻塞的是没加限制的大查询、N+1、或事务卡住。关键控制点:
DB::table(...)->get() 或 Model::all() 必须配 ->limit(100),生产环境禁用无限制全表拉取DB::enableQueryLog() + DB::getQueryLog() 在本地调试,揪出慢 SQL;线上改用 slow_query_log 配合 long_query_time = 1
DB::transaction() 块内只做 DB 操作simplePaginate 以外的方案处理百万级数据;考虑游标分页(cursorPaginate)常见报错是 SQLSTATE[HY000]: General error: 2006 MySQL server has gone away 或 Connection refused。这不是崩溃,是预期行为:
mysql.connect_timeout 和 mysqli.reconnect 开启(Laravel 8+ 默认开启)php artisan queue:restart 强制刷新,别直接 kill 进程max_connections 是否被占满(SHOW STATUS LIKE 'Threads_connected'),必要时调高或加连接复用真正难搞的不是杀查询,而是 Laravel 在事务里调用了一个没设超时的外部 HTTP 接口,导致 MySQL 连接挂着不动 —— 这种得去查 strace -p ,不是 phpMyAdmin 能解决的。pid