国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - Mysql解決數據庫N+1查詢問題

Mysql解決數據庫N+1查詢問題

2020-11-25 13:24步履不停 Mysql

在本篇文章里小編給大家分享了關于Mysql解決數據庫N+1查詢問題的相關知識點內容,需要的朋友們參考下。

簡介

在orm框架中,比如hibernate和mybatis都可以設置關聯對象,比如user對象關聯dept
假如查詢出n個user,那么需要做n次查詢dept,查詢user是一次select,查詢user關聯的
dept,是n次,所以是n+1問題,其實叫1+n更為合理一些。

mybatis配置

UserMapper.xml

?
1
2
3
4
5
6
7
<resultMap id="BaseResultMap" type="testmaven.entity.User">
  <id column="id" jdbcType="INTEGER" property="id" />
  <result column="name" jdbcType="VARCHAR" property="name" />
  <result column="age" jdbcType="INTEGER" property="age" />
  <result column="dept_id" jdbcType="INTEGER" property="deptId" />
  <association property="dept" column="dept_id" fetchType="eager" select="testmaven.mapper.DeptMapper.selectByPrimaryKey" ></association>
 </resultMap>

 

數據表如下:

department表

|id|name|

user表

|id|name|department_id|

需求是得到以下結構的數據:

?
1
2
3
4
5
[
  {    "id":1,    "name":"test",    "department_id":1,    "department":{      "id":1,      "name":"測試部門"
    }
  }
]

方法一:循環查詢

查詢用戶列表

循環用戶列表查詢對應的部門信息

?
1
2
3
$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
$users = $db->query('SELECT * FROM `user` INNER JOIN `department` ON `department`.`id` = `user`.`department_id`');// 手動處理返回結果為需求結構

該方法其實也有局限性,如果 user 和 department 不在同一個服務器是不可以連表的。

方法三:1+1查詢

該方法先查詢1次用戶列表

取出列表中的部門ID組成數組

查詢步驟2中的部門

合并最終數據

代碼大致如下:

?
1
2
3
4
5
6
7
8
9
10
11
$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;
 }

該方法對兩個表沒有限制,在目前微服務盛行的情況下是比較好的一種做法。

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 午夜影院黄色 | 亚洲不卡高清视频 | 欧美日韩成人网 | 一级片| 午夜精品一区 | 欧美日韩一区二区三区在线观看 | 亚洲天堂一区二区 | 成视频年人免费看黄网站 | 精精国产xxxx视频在线播放7 | 国内精品一区二区 | 欧美久久精品一级黑人c片 成人在线视频免费观看 | 亚洲欧美日韩精品久久亚洲区 | 成人黄色片网站 | 午夜男人的天堂 | 欧美在线视频a | 国产精品高清在线 | 亚洲成人精品一区 | 亚洲成人av在线 | 人人爽人人爽人人片av | 九九香蕉视频 | 久久精品亚洲精品 | 日韩精品91爱爱 | 久久一二三四 | 蜜桃传媒一区二区 | 午夜精品久久久久久久久 | 欧美视频免费 | 亚洲自拍偷拍在线 | 亚洲国产精品一区二区三区 | 日韩成人| 亚洲成人久久久 | 欧洲精品 | 偷拍第一页 | 黄a在线 | 亚洲成人一级 | 久久av综合 | 欧美日韩中文在线观看 | 国产精品视频一二三区 | 亚州国产 | 日韩欧美国产一区二区 | 国产成人久久精品一区二区三区 | 在线观看日韩 |