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
相关产品推荐
相关产品推荐

