Apache-2.2

優化 PHP<>MySQL 性能

  • April 10, 2010

我正在嘗試在此測試腳本上優化我的 PHP<>MySQL:

&lt;?
 for($i=0;$i&lt;100;$i++)//Iterations count
   $res.= var_dump(loadRow("select body_ru from articles where id&gt;$i*50 limit 100"));

 print_r($res);
?&gt;

我有 APC,並且文章表在 id 上有一個索引。此外,所有這些查詢都在訪問查詢記憶體,所以如果 MySQL 性能很好的話。

但是當我使用 ab -c 10 -t 10 來測試這個腳本時,我得到:

100 次迭代:~100req/sec(~10'000 MySQL 查詢每秒)

5 次迭代:~200req/sec

1 次迭代:~380req/秒

0 次迭代:~580req/sec

我試圖在 PHP 中禁用持久連接——它讓它變慢了一點。那麼,如果 MySQL 不限制性能,我怎樣才能讓它工作得更快呢?

所以這看起來像建立連接或其他東西需要太多時間……

mysql_pconnect 會更快,但是,正在消失(我不相信它甚至被 mysqli 支持)。持久連接消除了連接/拆卸時間。

你的mysql是通過TCP還是socket連接的?如果是 TCP,是否打開了壓縮或 SSL?當您期望較大的響應時,壓縮是好的,但是,對於較小的響應,您會花費更多的 cpu 時間在兩側進行壓縮/解壓縮。您希望大約 99% 的時間都使用壓縮。php 和 mysql 之間的 SSL 連接將是明確的性能障礙。

如果您通過 TCP 連接,mysql 中的 skip-name-resolve 會加快速度。然後需要在您的授權中使用 IP 而不是域名。

但是,您對這些查詢可能在記憶體中的假設取決於您的記憶體有多大以及您的結果集有多大。如果您的查詢平均每個結果集為 400k(假設文章長度為 4k),那麼您至少需要一個 40mb 的查詢記憶體來記憶體內容。如果您發送回任何整數欄位,請記住 libmysqlclient 庫將整數轉換為 ascii,然後 php 在收到結果時必須將其轉換為任何數據類型。

mysql_fetch_assoc 比 mysql_fetch_row 稍微慢一些,但還不足以讓您發現將程式碼轉換為使用它是值得的。

我相信您可能遇到了與 mysql 伺服器的連接問題。如果您使用的是 TCP,您需要進行一些更改。如果您使用的是套接字連接,那麼您可能無法從中調整太多性能。

@pQd,根據我的經驗,我發現索引查詢的限制子句上的查詢優化器將從索引中得到回答,並且使用範圍索引不會對結果產生太大影響。範圍查詢也不會考慮後來刪除的文章 ID,這會導致分頁。如果刪除其中 20 篇文章,第 100-150 條將返回 30 行,這可能無法正確填滿您的頁面。數據表示的限制條款通常是正確的方法。只有當您使用 sql_count_rows 時,mysql 才會執行整個查詢,這是另一個有用的分頁工具。您要確保從索引中回答這些查詢以防止表掃描。

引用自:https://serverfault.com/questions/131187