我如何优化代码以更新mysql表?

时间:2018-08-30 15:22:30

标签: php mysql

好吧,我有这个代码:

<?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;

这个想法:有一个带有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

2 个答案:

答案 0 :(得分:2)

janmyszkier提出了一个很好的观点,因为您的表似乎缺少键和/或索引。这些简单的查询不应使您的系统瘫痪。

关于优化当前SQL的方法,可以通过连接两个表将两个select语句组合为一个语句:

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

确保在EGN和clientEGN列上具有索引,以加快连接速度。

请注意,您的代码示例引用了一个名为“ surName”的列,但该列在您提供的表定义中不存在。我改用secondName,因为它似乎是最好的匹配。

答案 1 :(得分:1)

首先,确保表具有索引(如果clientEGN没有索引,则用ADD INDEX添加一个索引)。这应该可以“稍微”加快搜索查询速度

添加索引后,如果您的代码仍需要优化,请立即联系我们。 该代码不是最佳代码,但易于理解和维护。我可以建议在其中将IF与JOIN和UPDATE一起加入,但这会使代码变得更加复杂和初级开发人员难以维护,因此,在这一点上,我不建议您更改当前的内容。