当前位置:首页 » 编程语言 » mysqlphp查询语句

mysqlphp查询语句

发布时间: 2025-10-03 22:50:58

php + Mysql多个表并行查询如何实现

在PHP-FPM处理HTTP请求时,有时会遇到一个请求需要进行多次MySQL查询(在报表类应用中比较常见)。通常我们会以串行方式查询:

$link=newmysqli();
$rs1=$link->query('SELECT*FROMtable1');
while($row=$rs1->fetch_row()){...}
$rs2=$link->query('SELECT*FROMtable2');
while($row=$rs2->fetch_row()){...}
$rs3=$link->query('SELECT*FROMtable3');
while($row=$rs3->fetch_row()){...}

串行查询方式有个缺点:在MySQL返回数据之前,PHP一直是处于空等的状态,不会继续往后执行。如果数据量大或者查询复杂,MySQL响应可能会比较慢,那么以串行方式查询会有一些延迟。给用户最直接的感受就是 Loading… 的圈圈一直打转。

那么有什么办法可以减少查询MySQL的时间?用多进程并行查询不行,因为PHP-FPM 中不允许用 pcntl_fork 一类的调用。

幸好还有 mysqlnd,mysqlnd提供了类似 stream_select 的机制(见 这篇文章) ,可以做到在单进程中对MySQL并行查询。这主要运用了mysqli_poll 和 reap_async_query 两个函数。

还是通过例子来介绍MySQL并行查询的实施方法。假设要并行地向MySQL发出10个查询,最基本的代码应该是这样的:

1.$links=[];
2.for($i=0;$i!==10;$i++){
3.$links[$i]=newmysqli('127.0.0.1','user','password','db1');
4.$links[$i]->query('SELECTSLEEP(1)',MYSQLI_ASYNC);
5.}
6.$allResult=[];
7.while(!empty($links)){
8.$reads=$links;
9.$errors=$reject=[];
10.if(!mysqli_poll($reads,$errors,$reject,null)){
11.continue;
12.}
13.foreach($readsas$read){
14.$idx=array_search($read,$links,true);
15.$allResult[$idx]=[];
16.$result=$read->reap_async_query();
17.while($row=$result->fetch_row()){
18.$allResult[$idx][]=$row;
19.}
20.$read->close();
21.unset($links[$idx]);
22.}
23.}

解释下这段代码的含义:

2~5行,同时发起10个MySQL连接,并发出查询

注意query() 的第二个参数带上了 MYSQLI_ASYNC 表示非阻塞查询

10行,使用mysqli_poll 轮询10个连接的查询有无返回

mysqli_poll 的第一个参数$reads是个数组,包含需要轮询那些连接。mysqli_poll 执行完后,会改写$reads,改写后$reads包含的是那些已经有数据返回连接。

mysqli_poll的第四个参数,控制的是轮询的等待时间,单位是“秒”。如果像本例当中设置为null,那么mysqli_poll轮询是阻塞的:只有监听的连接中,任意一个连接有数据返回了,mysqli_poll才会返回。如果等待时间设置为0,那么每次执行mysqli_poll会立即返回,外层的while会频繁循环。

第11~19行,遍历已经有数据返回的连接

reap_async_query和普通query一样,返回的是mysqli_result,可以一行行fetch数据

20~21行,对于已经获得了数据的连接,下次mysqli_poll就不需要再轮询这个连接了,所以关闭连接,并从$links数组删除这个连接

当所有的连接都返回了数据,$links数组空了,while循环也就终止了。

使用并行查询的方式,可以大大缩短处理HTTP请求的时间,假设本例中的10个SQL查询,每个需要执行1秒。因为是并行,处理所有的查询,也只需要1秒左右。

⑵ 求高人给一个用PHP+MySQL实现的简单的数据库查询功能的PHP和HTML代码

首先我是新手, 看到这个问题试了下, 不知道能不能帮助你!希望~
还有很多条件没有判断, 我正则不是很会。 写的很粗糙,勉强能用, 希望别介意哈!

<?php
class Database {
public $conn;
public function Database() {
$this->conn = mysql_connect("localhost","user","password");
mysql_select_db("gamesearch",$this->conn);
mysql_query("SET NAMES 'UTF8'");
}
public function get_data_array($sql) {
$rs = mysql_query($sql,$this->conn);
$data_array = array();
while($data = mysql_fetch_array($rs,MYSQL_ASSOC)) {
$data_array[] = $data;
}
mysql_free_result($rs);
return $data_array;
}
}
$db = new Database();
if($_GET['year'] == "") {
echo "请输入年份!";
}else {
if($_GET['year'] == "all") {
$sql = "select GameName from GameSearch";
}else {
$sql = "select GameName from GameSearch where ReleaseYear = ".$_GET['year'];
}
$data = $db->get_data_array($sql);
foreach($data as $k=>$v) {
echo $v['GameName']."<br />";
}
}
?>
<form action="test.php" method="get">
年份:<input type="text" name="year" value="all" />
<input type="submit" value="提交" />
</form>

⑶ PHP访问MySQL数据库的步骤。

1,windows+r键,按cmd确认进入管理员界面

2,找到安装mysql对应目录bin下
3,mysql -u 用户名 -p 密码 (回车进入)
接下啦,进行数据库查看相关命令,例show databases;

热点内容
android查看工具mac 发布:2025-10-04 01:34:31 浏览:469
一级缓存增大 发布:2025-10-04 01:17:58 浏览:841
手机的内存储卡如何装上传输器上 发布:2025-10-04 01:04:28 浏览:979
大数据sql分页查询 发布:2025-10-04 01:01:38 浏览:768
吃石榴解压 发布:2025-10-04 00:58:53 浏览:981
油漆存储管理制度 发布:2025-10-04 00:20:36 浏览:89
传祺m8哪个配置有按摩 发布:2025-10-04 00:19:27 浏览:349
redhat怎么打开ftp 发布:2025-10-04 00:05:24 浏览:268
shell调用存储过程 发布:2025-10-04 00:04:47 浏览:958
树莓派gcc编译选项x86平台 发布:2025-10-03 23:57:57 浏览:241