簡體   English   中英

從PHP到PostgreSQL的查詢非常慢,如何增加?

[英]Query from PHP to PostgreSQL is very slow, how to increase?

PHP:

$dbconn = pg_connect("host=127.0.0.1 dbname=test user=test password=test");
$start = microtime(true); 
for($i=1;$i<=5000;$i++) { 
    pg_query("insert into testtb(uid,sid) values($i,$i)"); 
} 
echo ( (microtime(true) - $start) *1000).' ms';
// result: 15504.348993301 ms

PSQL shell:

begin for r in 1..5000 loop 
insert into testtb (uid,sid) values(r,r); 
end loop; end; $$; 
// result: 43 ms

testtb很簡單,只有兩列siduid ,都是索引的。 PHP和PG在同一台服務器上。 從測試中我們可以看到Postgres的速度非常快,可以插入5000個記錄。 但是當使用PHP時,速度顯着下降。 那我們怎樣才能提高PHP + PG的速度呢?

編輯:請注意結果:PHP - 15504毫秒,psql外殼 - 43毫秒

看起來像是一個災難性的往返延遲問題。 我打賭你的PHP腳本在另一台計算機上運行(不是127.0.0.1)? 我想知道,這相比如何表現?

 $db = new PDO('pgsql:host=localhost;port=5432;dbname=test;', 'username', 'password', array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
$start = microtime(true); 
$db->beginTransaction();
$stm=$db->prepare("INSERT INTO testtb(uid,sid) VALUES(?,?)");
for($i=1;$i<=5000;++$i) { 
    $stm->execute(array($i,$i));
} 
$db->commit();
echo ( (microtime(true) - $start) *1000).' ms';

編輯:如果他們確實在同一台計算機上運行,​​我的下一個猜測是你的PHP腳本通過TCP連接,而PSQL shell通過unix套接字連接。 unix套接字比TCP連接快得多,即使在本地主機上也是如此,但我不希望有這么大的差別 - 除非你有一個攔截本地主機到本地主機連接的防火牆,有問題的防火牆可能會導致嚴重的延遲問題,這可能會解釋一下。 嘗試用PHP連接到unix套接字,例如

 $db = new PDO('pgsql:unix_socket=/var/run/postgresql.sock;dbname=test;', 'username', 'password', array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
$start = microtime(true); 
$db->beginTransaction();
$stm=$db->prepare("INSERT INTO testtb(uid,sid) VALUES(?,?)");
for($i=1;$i<=5000;++$i) { 
    $stm->execute(array($i,$i));
} 
$db->commit();
echo ( (microtime(true) - $start) *1000).' ms';

這是怎么表現的? (應該執行比TCP連接甚至更好,但如果你有防火牆問題,它可能比TCP連接的性能好得多)

如果你不知道你的pqsql unix套接字在哪里,這個命令通常會找到它: sudo find / -iname "*.sock*" 2 >/dev/null

(順便說一句,我認為/var/run/postgresql.sock是Debian和Ubuntu系統上的默認位置)

最后我發現這個結果是正常的 使用PHP時,每個查詢的插入次數為1行。 我在PostgreSQL服務器上運行TPS基准測試,結果大約是500 TPS。 因此合理地花費15秒來插入5000行。

至於為什么PostgreSQL shell非常快,我認為它不是一個查詢循環,而是一個批量查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM