當前位置:首頁 » 編程語言 » 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 瀏覽:471
一級緩存增大 發布:2025-10-04 01:17:58 瀏覽:843
手機的內存儲卡如何裝上傳輸器上 發布:2025-10-04 01:04:28 瀏覽:980
大數據sql分頁查詢 發布:2025-10-04 01:01:38 瀏覽:769
吃石榴解壓 發布:2025-10-04 00:58:53 瀏覽:982
油漆存儲管理制度 發布: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