好吧,我有这个代码:
<?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
答案 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一起加入,但这会使代码变得更加复杂和初级开发人员难以维护,因此,在这一点上,我不建议您更改当前的内容。