搜索
首页每日编程mysql知识解决数据库N+1查询问题

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

Jun 19, 2019 am 09:40 AM
数据库

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

需求

数据表如下:

department表

|id|name|

user表

|id|name|department_id|

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

[
    {        "id":1,        "name":"test",        "department_id":1,        "department":{            "id":1,            "name":"测试部门"
        }
    }
]

方法一:循环查询

  1. 查询用户列表

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

$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次查询部门),性能最低,不可取。

方法二:连表

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

  2. 处理返回数据

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

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

方法三:1+1查询

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

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

  3. 查询步骤2中的部门

  4. 合并最终数据

代码大致如下:

$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;
 }

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

更多MySQL相关技术文章,请访问MySQL教程栏目进行学习!

以上是解决数据库N+1查询问题的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
如何保护MySQL Server免受未经授权的访问?如何保护MySQL Server免受未经授权的访问?Mar 20, 2025 pm 03:20 PM

本文讨论了通过密码管理,使用远程访问,使用加密和常规更新来确保MySQL服务器免于未经授权的访问。它还涵盖监视和检测可疑活动以提高安全性。

您如何使用角色管理用户权限?您如何使用角色管理用户权限?Mar 20, 2025 pm 03:19 PM

本文讨论了使用角色有效管理用户权限,详细介绍角色定义,权限分配和动态调整。它强调了基于角色的访问控制以及角色如何简化用户管理ACR的最佳实践

如何在MySQL中设置用户帐户密码?如何在MySQL中设置用户帐户密码?Mar 20, 2025 pm 03:18 PM

本文讨论了设置和确保MySQL用户帐户密码,密码安全性的最佳实践,远程密码更改以及确保符合密码策略的方法。

MySQL中有哪些不同类型的特权?MySQL中有哪些不同类型的特权?Mar 20, 2025 pm 03:16 PM

文章讨论了MySQL特权:全局,数据库,表,列,例程和代理用户类型。它解释了授予,撤销特权和安全管理的最佳实践。突出了过度的风险。

您如何使用赠款说明向用户授予特权?您如何使用赠款说明向用户授予特权?Mar 20, 2025 pm 03:15 PM

本文解释了SQL中赠款语句的使用来分配各种特权,例如选择,插入和更新到用户或特定数据库对象上的角色。它还涵盖了通过撤销声明并授予特权的撤销特权

如何使用创建用户语句在MySQL中创建用户?如何使用创建用户语句在MySQL中创建用户?Mar 20, 2025 pm 03:14 PM

文章讨论使用创建用户语句,分配特权,设置密码和选择用户名来创建MySQL用户。

您如何授予执行存储过程和功能的权限?您如何授予执行存储过程和功能的权限?Mar 20, 2025 pm 03:12 PM

文章讨论了授予有关存储过程和功能的执行权限,重点介绍了SQL命令和最佳实践,以实现安全的多用户数据库管理。

如何从另一个存储过程或功能调用存储过程?如何从另一个存储过程或功能调用存储过程?Mar 20, 2025 pm 03:11 PM

本文讨论了从其他存储过程或功能中调用存储过程,重点是SQL Server。它涵盖语法,诸如模块化和安全性,错误处理以及嵌套过程的设计注意事项。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具