[英]Query from PHP to PostgreSQL is very slow, how to increase?
$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
begin for r in 1..5000 loop
insert into testtb (uid,sid) values(r,r);
end loop; end; $$;
// result: 43 ms
testtb
很簡單,只有兩列sid
和uid
,都是索引的。 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.