请教Laravel下对于查询缓存和慢查询的两个问题

  1. 查询缓存如何管理?
  • 面临的问题:
    项目代码中各处都有很多查询后的Cache,key的命名缺乏规范,缺少统一管理。
    另外像 gnahotelsolutions/laravel-query-cache 之类的查询缓存库可以自动处理缓存key,还能提供一些类似分组的功能。不知道实际应用中有多少人会用,是不是靠谱。
    以及有什么好的办法可以统计缓存命中率。
  1. ORM下如何排查定位慢查询?
    面临的问题:大量使用ORM的情况下,对于slow log中的sql大家是如何定位的。

请教下大家对于这些问题,有没有什么好的实践方式。

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
Junwind
最佳答案

第一个问题,建议单独搞一个文件,作为redis key的记录,比如我现在要加一个redis key,我就在 cacheKey.php配置中,写上

<?php
// redis的key都记在这里面,最好加上注释
return [
    "userInfo" => "xx_userInfo_",
    'userDes' => "xx_userDes_",
    'shopInfo' => 'xx_shopInfo_',
    ......
];

使用时

$redis = new Redis();
$userInfoKey = $cacheKey['userInfo'] . $userId;
$userInfo = $redis->get($userInfoKey);

问题2:
sql慢,一般有几个常见毛病:

  1. 表数据很大了。
  2. 表没有索引,或者索引没有命中。
  3. sql本身问题,比如联表查询过多,写的过于繁琐等。
  4. ORM 自身瓶颈。

处理:

  1. 分表。
  2. 加索引。
  3. 加缓存,或者拆分查询,用代码去筛选条件。
  4. 替换为POD的sql。

可以在执行sql的地方,加耗时记录,分析具体是哪些ORM执行的sql慢。

1年前 评论
穿过你的黑发的我的手 (楼主) 1年前
Junwind (作者) 1年前
讨论数量: 8

客户:这个列表怎么这么慢

1年前 评论
周小云 1年前

问题2:可以试下 overtrue/laravel-query-logger

1年前 评论
Junwind

第一个问题,建议单独搞一个文件,作为redis key的记录,比如我现在要加一个redis key,我就在 cacheKey.php配置中,写上

<?php
// redis的key都记在这里面,最好加上注释
return [
    "userInfo" => "xx_userInfo_",
    'userDes' => "xx_userDes_",
    'shopInfo' => 'xx_shopInfo_',
    ......
];

使用时

$redis = new Redis();
$userInfoKey = $cacheKey['userInfo'] . $userId;
$userInfo = $redis->get($userInfoKey);

问题2:
sql慢,一般有几个常见毛病:

  1. 表数据很大了。
  2. 表没有索引,或者索引没有命中。
  3. sql本身问题,比如联表查询过多,写的过于繁琐等。
  4. ORM 自身瓶颈。

处理:

  1. 分表。
  2. 加索引。
  3. 加缓存,或者拆分查询,用代码去筛选条件。
  4. 替换为POD的sql。

可以在执行sql的地方,加耗时记录,分析具体是哪些ORM执行的sql慢。

1年前 评论
穿过你的黑发的我的手 (楼主) 1年前
Junwind (作者) 1年前

不知道你的Laravel版本是多少

10.x的话可以用这个监控慢查询
快速入门《Laravel 10 中文文档》

9.x 可以在 AppServiceProvider 中监听查询事件
快速入门《Laravel 9 中文文档》

1年前 评论

有没有好用的 laravel model cache

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!