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

Laravel中Auth::user()查询极慢(耗时2.7s)如何优化?

Laravel中Auth::user()查询极慢的优化方案求助

调用Auth::user()时遇到查询耗时约2.7秒的问题,严重拖慢应用运行速度。

问题细节

通过在AppServiceProvider.php中使用DB::listen()记录数据库查询:

DB::listen(function ($query) {
    Log::info("Query: {$query->sql} | Bindings: " . implode(', ', $query->bindings) . " | Time: {$query->time}ms ");
});

得到的查询日志如下:

[2025-02-27 15:54:26] local.INFO: Query: select * from `users` where `id` = ? limit 1 | Bindings: 1 | Time: 2695.51ms

但直接在MySQL中执行该查询却能瞬间得到结果。

users表结构及索引

建表语句:

CREATE TABLE `users` (
   `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
   `name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
   `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
   `email_verified_at` timestamp NULL DEFAULT NULL,
   `email_2` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
   `email_3` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
   `password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
   `remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
   `is_active` tinyint(1) NOT NULL DEFAULT 1,
   `created_at` timestamp NULL DEFAULT NULL,
   `updated_at` timestamp NULL DEFAULT NULL,
   PRIMARY KEY (`id`),
   UNIQUE KEY `users_email_unique` (`email`)
 ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

索引信息:

users   0   PRIMARY 1   id  A   4               BTREE       
users   0   users_email_unique  1   email   A   4               BTREE       

可能的优化方案

  • 缓存用户数据:Auth::user()默认每次调用都会发起新查询,可在登录后将用户数据存入Redis/文件缓存,后续直接读取缓存。示例:
    // 登录时缓存用户
    $user = Auth::user();
    Cache::put('user_' . $user->id, $user, now()->addMinutes(60));
    
    // 后续获取优先读缓存
    $user = Cache::get('user_' . Auth::id(), fn() => Auth::user());
    
  • 优化数据库连接:将数据库配置中的host从localhost改为127.0.0.1,避免DNS解析延迟;检查数据库连接池配置,确保连接复用正常。
  • **避免SELECT ***:修改用户查询逻辑,只获取必要字段。可在User模型中重写查询方法:
    public function resolveRouteBinding($value, $field = null)
    {
        return $this->select('id', 'name', 'email', 'password')
                    ->where($field ?? 'id', $value)
                    ->first();
    }
    
  • 排查模型额外逻辑:检查User模型是否存在全局作用域、观察者或自动加载的关联($with属性),这些会增加查询复杂度,按需移除或调整。
  • 检查MySQL会话状态:通过SHOW PROCESSLIST查看数据库连接状态,确认是否存在锁表、未提交事务等阻塞情况。
  • 关闭调试模式:若开启APP_DEBUG=true,Laravel会收集调试信息拖慢性能,可临时关闭测试速度。

内容的提问来源于stack exchange,提问作者Antonio De Simeis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 04:35:20