Heim >tägliche Programmierung >MySQL-Kenntnisse >Lösen Sie das Datenbank-N+1-Abfrageproblem

Lösen Sie das Datenbank-N+1-Abfrageproblem

步履不停
步履不停Original
2019-06-19 09:40:049848Durchsuche

Lösen Sie das Datenbank-N+1-Abfrageproblem

Anforderungen

Die Datentabelle lautet wie folgt:

Abteilungstabelle

|id|name|

Benutzertabelle

|id|name|department_id|

Die Anforderung besteht darin, Daten mit der folgenden Struktur zu erhalten:

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

Methode 1: Schleifenabfrage

  1. Fragen Sie die Benutzerliste ab

  2. Schleifen Sie die Benutzerliste ab, um die entsprechenden Abteilungsinformationen abzufragen

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

Die Anzahl der Abfragen Für diese Methode gilt: 1+N (1 Abfrageliste, Abfrageabteilung N-mal), weist die niedrigste Leistung auf und ist nicht empfehlenswert.

方法二:连表

  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教程栏目进行学习!

Das obige ist der detaillierte Inhalt vonLösen Sie das Datenbank-N+1-Abfrageproblem. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn