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

我使用嵌套查询从多个表中检索信息。我需要关于优化这段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'");
 $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();