如何优化更新mysql表的代码?

qpgpyjmq  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(224)

我有个密码:

<?php
require_once('../assets/db/DBConnect.php');
$conn = DBConnect::conn();

echo "<pre>";
$usersWithoutSurnames = [];
$usersWithSurnames = [];
$i = 0;

$query = 'SELECT * FROM person where surName IS NULL';
$res = $conn->query($query);
while($row = $res->fetch_assoc()) {
    if ($i > 7)
        break;
    $usersWithoutSurnames[] = $row;
    $i++;
}

foreach ($usersWithoutSurnames as $user) {
    $getSurnameQuery = 'SELECT clientSecondname from policy WHERE clientEGN = ? ORDER BY id DESC LIMIT 1';

    if($stmt = $conn->prepare($getSurnameQuery)) {
        $egn = $user['egn'];
        $stmt->bind_param("s", $egn);

        $r = $stmt->execute();

        $stmt->bind_result($clientSecondname);
        $stmt->fetch();
        $user['surName'] = $clientSecondname;
        $usersWithSurnames[] = $user;
        $stmt->close();
    }
}

var_dump($usersWithoutSurnames);
echo '-------------------------------------------------';
echo "<pre>"; var_dump($usersWithSurnames); exit;

想法:有一张table users (person) 但有些用户没有姓,所以我查了另一个 table (policy) 对于他们的姓氏,用相同的用户填充第二个数组,但要使用姓氏,然后我将用这个数组填充和表。你可以看到我只得到7个用户,因为当我试图得到更多的用户它超时,我可以优化这个代码/查询与更多的用户一起工作?
表结构:
人:

|------------------------------------------------
|  Id  | firstName | secondName | lastName | EGN
|   1  | test      |   NULL     |  test    | 123
|   2  | test      |   NULL     |  test    | 321

政策:

|------------------------------------------------------------------------
|  Id  | clientFirstname | clientSecondname | clientLastname | clientEGN
|   1  | test            |   test           |  test          |  123
|   2  | test            |   test           |  test          |  321
kognpnkq

kognpnkq1#

janmyszkier提出了一个很好的观点,因为您的表似乎缺少键和/或索引。这些简单的查询不应该破坏您的系统。
至于优化当前sql,您可以通过连接两个表将两个select语句合并为一个select语句:

select 
  person.*,
  policy.clientSecondname
from person
left join policy on policy.clientEGN = person.EGN
where person.secondName is null

确保在egn和clientegn列上有索引,以加速连接。
请注意,您的代码示例引用了一个名为“姓氏”的列,但该列在您提供的表定义中不存在。我用了第二个名字,因为它似乎是最好的匹配。

bfrts1fy

bfrts1fy2#

首先,确保表有索引(如果没有索引) clientEGN 添加一个(添加索引)。这应该会加快你的搜索查询“一点”
一旦你添加了索引,如果你的代码仍然需要优化,请告诉我们。代码不是最优的,但是易于理解和维护。我可以建议在if-within中使用join和updatejoined,但这会使代码更复杂,而且对于初级开发人员来说维护起来更麻烦,所以在这一点上,我不建议更改您当前拥有的代码。

相关问题