Php 如何为嵌套查询优化数据库连接?
我使用嵌套查询从多个表中检索信息。我需要关于优化这段php代码的建议 此函数用于创建一个对象Php 如何为嵌套查询优化数据库连接?,php,mysql,mysqli,Php,Mysql,Mysqli,我使用嵌套查询从多个表中检索信息。我需要关于优化这段php代码的建议 此函数用于创建一个对象 public function conn($query){ $mysqli = new mysqli('test','test','test','test'); $result = $mysqli->query("SET NAMES utf8"); $result = $mysqli->query("set character_set_client='utf8'"); $resul
public function conn($query){
$mysqli = new mysqli('test','test','test','test');
$result = $mysqli->query("SET NAMES utf8");
$result = $mysqli->query("set character_set_client='utf8'");
$result = $mysqli->query("set collation_connection='utf8_general_ci'");
$result = $mysqli->query($query);
$mysqli->close();
return $result;
}
此代码使用该函数
$connect = $this->conn("SELECT * FROM Table LIMIT 100000");
while($i = $connect->fetch_assoc()){
$name = $i["name"];
$connect2 = $this->conn("SELECT * FROM Names WHERE Name = '$name'");
if($connect2 ->num_rows > 0){
echo $name.'<br>';
}
}
$connect=$this->conn(“从表中选择*限制100000”);
而($i=$connect->fetch_assoc()){
$name=$i[“name”];
$connect2=$this->conn(“从Name='$Name'的名称中选择*);
如果($connect2->num_rows>0){
回显$name。“
”;
}
}
需要数据库连接的建议
如您所见,在while
循环中,我正在检查另一个表中是否存在$name
。但每次通过循环时,我都会打开和关闭一个连接。这将是100001连接打开和关闭
是否可以只打开一次与数据库的连接
注意:SQL就是一个例子——请不要在这里建议更改,因为我试图找出如何处理重复查询,而不是优化SQL。连接对象是可重用的。建立一个连接,然后使用它进行尽可能多的查询。完成后关闭每个查询(即每个结果集),然后在运行结束时关闭连接 关闭连接是一项网络操作,因此需要一段时间。关闭查询主要是内存中的操作,因此速度更快 在您的示例中,您使用的是嵌套查询(稍后将详细介绍)。您的代码最终应该类似于以下伪代码:
public function getconn(){
$mysqli = new mysqli('test','test','test','test');
$mysqli->query("SET NAMES utf8");
$mysqli->query("set character_set_client='utf8'");
$mysqli->query("set collation_connection='utf8_general_ci'");
return $mysqli; /* return the connection handle */
}
$conn1 = getconn();
$conn2 = getconn();
$resultset1 = $conn1->query("SELECT * FROM Table LIMIT 100000");
while($i = $resultset1->fetch_assoc()){
$name = $i["name"];
$resultset2 = $conn2->query("SELECT * FROM Names WHERE Name = '$name'");
if($resultset2->num_rows > 0){
echo $name.'<br>';
}
$resultset2->close();
}
$resultset1->close();
$conn1->close();
$conn2->close();
(请注意,我也没有调试此代码。)
现在,您的两个查询可能只是显示一组嵌套查询的示例。如果是的话,没关系。但是,您正在以一种几乎无法想象的低效方式执行此任务(检索100K个名称)。你说过你不希望任何人重写这个查询,但很抱歉,我不能让这个问题过去
这段代码将做一个更加精简的工作
$conn = getconn();
$q = "SELECT t.name FROM Table t JOIN Name n ON t.name = n.name LIMIT 100000";
$resultset = $conn->query($q);
while($i = $resultset->fetch_assoc()){
$name = $i["name"];
echo $name.'<br>';
}
$resultset->close();
$conn->close();
$conn=getconn();
$q=“从表t中选择t.name,t.name=n.name LIMIT 100000上的联接名称n”;
$resultset=$conn->query($q);
而($i=$resultset->fetch_assoc()){
$name=$i[“name”];
回显$name。“
”;
}
$resultset->close();
$conn->close();
它的效率更高有两个原因。首先,它没有使用SELECT*
,这会通过网络将各种数据从MySQL服务器发送到php程序,只是为了扔掉它
其次,它不使用嵌套查询。相反,联接查询从
表
中提取所有名称
列,这些列在名称
中具有匹配的名称
列 您需要加入并分组。@SergioTulentsev not和not。正如我在p.s.中所写的那样:例如,sql编写-请不要编辑此sql查询,因为只需要数据库连接的建议。
即只需要连接(而不是查询)的建议。祝你好运:)这是一个典型的N+1问题。因此,应该通过更改查询来解决此问题。@SergioTulentsev您认为不是真正的优化连接吗?
$conn = getconn();
$q = "SELECT t.name FROM Table t JOIN Name n ON t.name = n.name LIMIT 100000";
$resultset = $conn->query($q);
while($i = $resultset->fetch_assoc()){
$name = $i["name"];
echo $name.'<br>';
}
$resultset->close();
$conn->close();