资讯专栏INFORMATION COLUMN

解决数据库N+1查询问题

chenatu / 1643人阅读

摘要:需求数据表如下表表需求是得到以下结构的数据测试部门方法一循环查询查询用户列表循环用户列表查询对应的部门信息该方法查询次数为次查询列表,次查询部门,性能最低,不可取。

需求

数据表如下:

department表

|id|name|

user表

|id|name|department_id|

需求是得到以下结构的数据:

[
    {
        "id":1,
        "name":"test",
        "department_id":1,
        "department":{
            "id":1,
            "name":"测试部门"
        }
    }
]
方法一:循环查询

查询用户列表

循环用户列表查询对应的部门信息

$users = $db->query("SELECT * FROM `user`");
foreach($users as &$user) {
    $users["department"] = $db->query("SELECT * FROM `department` WHERE `id` = ".$user["department_id"]);
}

该方法查询次数为:1+N(1次查询列表,N次查询部门),性能最低,不可取。

方法二:连表

通过连表查询用户和部门数据

处理返回数据

$users = $db->query("SELECT * FROM `user` INNER JOIN `department` ON `department`.`id` = `user`.`department_id`");
// 手动处理返回结果为需求结构

该方法其实也有局限性,如果 userdepartment 不在同一个服务器是不可以连表的。

方法三:1+1查询

该方法先查询1次用户列表

取出列表中的部门ID组成数组

查询步骤2中的部门

合并最终数据

代码大致如下:

$users = $db->query("SELECT * FROM `user`");
$departmentIds =[ ];
foreach($users as $user) {
    if(!in_array($user["department_id"], $departmentIds)) {
        $departmentIds[] = $user["department_id"];
    }
}
$departments = $db->query("SELECT * FROM `department` WHERE id in (".join(",",$department_id).")");
$map = []; // [部门ID => 部门item]
foreach($departments as $department) {
    $map[$department["id"]] = $department;
}

foreach($users as $user) {
    $user["department"] = $map[$user["department_id"]] ?? null;
 }

该方法对两个表没有限制,在目前微服务盛行的情况下是比较好的一种做法。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/31750.html

相关文章

  • Redis缓存穿透问题解决方案

    摘要:方案二布隆过滤器拦截布隆过滤器介绍概念布隆过滤器英语是年由布隆提出的。这就是布隆过滤器的基本思想。防缓存穿透的布隆过滤器判断是否为合法非法则不允许继续查库从缓存中获取数据缓存为空从数据库中获取缓存空对象参考书籍开发与运维 上周在工作中遇到了一个问题场景,即查询商品的配件信息时(商品:配件为1:N的关系),如若商品并未配置配件信息,则查数据库为空,且不会加入缓存,这就会导致,下次在查询同...

    AlanKeene 评论0 收藏0
  • 数据仓库架构的变迁

    摘要:前面我们简单阐述了分布式数据库的架构,并通过一条简单的查询语句解释了分布式的执行计划。 引言 第八届中国架构师大会(SACC2016)10月27号到29号在北京万达索菲特大饭店成功举办。大会以架构创新之路为主题,云集了国内外顶尖专家,共同探讨云计算和大数据等技术背景下,如何通过架构创新及各种IT新技术来带动企业转型增效。作为一家专注于云端数据仓库的初创公司,酷克数据受邀在SACC201...

    Raaabbit 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<