等待回應時間 - php+mysql環境下正在等待localhost的響應這個病怎麼治呢?

來源:互聯網
上載者:User
本地安裝的php和mysql環境,用localhost訪問某頁面,該頁面只是一個簡單的連結mysql資料庫並按以下sql語句執行查詢並echo出資料,其中還用到了一個網上很流行的分頁函數,每頁顯示20條資料,總的資料庫有進30萬條資料。

SELECT Id,col1,col2col3,col4,col5 FROM DBtable LIMIT 100,20;

這條語句在mysql任務視窗裡面的執行時間只有0.01sec
但是要開啟這個PHP頁面卻需要近1分鐘時間,至少也要40秒。

開啟頁面時,一開始都在顯示正在等待localhost的響應,然後就非常慢。

等地host檔案我已經加了127.0.0.1 localhost

my.ini檔案內容如下:
basedir = L:/develop/mysql-5.6.24-win32
datadir = L:/develop/TestMysqlData
character_set_server=utf8
character_set_client=utf8
bind-address = 127.0.0.1
max_connections=100

負責連結資料庫的config.php的執行時間也很短:[config.php頁面執行時間:0.0050408840179443 ]秒

[config.php頁面執行時間:{$total22} ]秒";?>

通過分析發現,該php頁面中連結資料庫後執行sql的時間長是罪魁禍首!!!![執行sql時間:54.735748052597 ]秒

 ceil($total / $showrow))    $curpage = ceil($total_rows / $showrow); //當前頁數大於最後頁數,取最後一頁//擷取資料$sql .= " LIMIT " . ($curpage - 1) * $showrow . ",$showrow;";$query = mysql_query($sql);$etime=microtime(true);//擷取程式執行結束的時間$total=$etime-$stime;   //計算差值echo "
[執行sql時間:{$total} ]秒";echo "

[SQL:{$sql} ]

";?>

網上查了一些關於等待回應時間過長的解決辦法,經過嘗試也無效。。

請幫我分析分析是什麼原因呢?我感覺主要是這個PHP等到mysql響應的時間很長,而實際執行sql語句的時間其實也是很快的,為什麼會出現這種貌似找不到mysql的現象呢?
更多 0

回複內容:

本地安裝的php和mysql環境,用localhost訪問某頁面,該頁面只是一個簡單的連結mysql資料庫並按以下sql語句執行查詢並echo出資料,其中還用到了一個網上很流行的分頁函數,每頁顯示20條資料,總的資料庫有進30萬條資料。

SELECT Id,col1,col2col3,col4,col5 FROM DBtable LIMIT 100,20;

這條語句在mysql任務視窗裡面的執行時間只有0.01sec
但是要開啟這個PHP頁面卻需要近1分鐘時間,至少也要40秒。

開啟頁面時,一開始都在顯示正在等待localhost的響應,然後就非常慢。

等地host檔案我已經加了127.0.0.1 localhost

my.ini檔案內容如下:
basedir = L:/develop/mysql-5.6.24-win32
datadir = L:/develop/TestMysqlData
character_set_server=utf8
character_set_client=utf8
bind-address = 127.0.0.1
max_connections=100

負責連結資料庫的config.php的執行時間也很短:[config.php頁面執行時間:0.0050408840179443 ]秒

[config.php頁面執行時間:{$total22} ]秒";?>

通過分析發現,該php頁面中連結資料庫後執行sql的時間長是罪魁禍首!!!![執行sql時間:54.735748052597 ]秒

 ceil($total / $showrow))    $curpage = ceil($total_rows / $showrow); //當前頁數大於最後頁數,取最後一頁//擷取資料$sql .= " LIMIT " . ($curpage - 1) * $showrow . ",$showrow;";$query = mysql_query($sql);$etime=microtime(true);//擷取程式執行結束的時間$total=$etime-$stime;   //計算差值echo "
[執行sql時間:{$total} ]秒";echo "

[SQL:{$sql} ]

";?>

網上查了一些關於等待回應時間過長的解決辦法,經過嘗試也無效。。

請幫我分析分析是什麼原因呢?我感覺主要是這個PHP等到mysql響應的時間很長,而實際執行sql語句的時間其實也是很快的,為什麼會出現這種貌似找不到mysql的現象呢?
更多 0

Windows 上 PHP 串連 MySQL 響應慢的原因
原因:my.ini裡配置了bind-address=127.0.0.1

分析:
1.my.ini裡配置bind-address=127.0.0.1時,Win7及其以上版本系統PHP用localhost串連MySQL耗時超過1秒,比用127.0.0.1串連慢了400倍.
2.my.ini裡配置bind-address=::1或bind-address=localhost時,Win7及其以上版本系統PHP用localhost串連MySQL速度是正常的,但用127.0.0.1串連又不正常了.
3.去掉bind-address配置,則用localhost或127.0.0.1串連MySQL速度都是正常的.
4.因為hosts裡localhost被解析到::1(IPv6)和127.0.0.1(IPv4),注釋掉 ::1 localhost 用localhost訪問速度就會變正常,但不推薦這樣做.

把主機地址改成127.0.0.1好像就可以了

30萬條記錄並不是很多,所以首先建議你考慮使用索引對查詢進行最佳化,這樣應該可以提升效率。
另一方面,通過mysql_num_rows查詢記錄總數是極大的敗筆,這首先就會導致所有的記錄被載入到php這邊,你的時間消耗在30萬條記錄從mysql傳送到php上了,應該使用select count(*)。
同時,我認為select count(*) 也是很無聊的,相對來說頁碼超出範圍是一個小機率事件,應該使用
select SQL_CALC_FOUND_ROWS ...
大致的邏輯如下:(我很久不直接調用mysql系列函數了,所以以下你還是當偽碼看吧,估計會有錯誤)

$sql = "select SQL_CALC_FOUND_ROWS Id,col1,col2col3,col4,col5 FROM DBtable limit $limit, $rows";$data = mysql_query($sql);if (mysql_num_rows($data) < 1) {    //如果沒有匹配的記錄,檢查所有合格行數是多少    $count = mysql_fetch_col(mysql_query("select last_found_rows()");    if ($count > 0) {        //說明有匹配的記錄,但是當前的limit導致的沒有取得資料        //因此重新定義limit子句重新查詢就行了        ...    }} else {    $rows = mysql_fetch_all($data);}

我想這樣會快很多。
如果你的資料量非常大的時候要考慮分表了,因為如果資料非常多,統計有多少行符合條件會導致極大的開銷。或者,比較消極的辦法是把合格記錄數緩衝起來,因為如果資料很多的時候通常也沒有人會在意精確的數目了,這也是為什麼有的應用(比如搜尋引擎的匹配結果)為什麼沒有最後一頁的原因,就是想算出這個數太費時間了,而且沒有人會真正在意很多頁之後的內容。

樓主說自己是新手,不太理解,所以補充如下

$sql = "SELECT Id,col1,col2col3,col4,col5 FROM DBtable"; //這裡後面的 LIMIT 去掉$countSql = "SELECT COUNT(*) FROM DBtable"; //加上這句$total = mysql_fetch_col(mysql_query($countSql)); //加上這句(這句你需要調試)$total = mysql_num_rows(mysql_query($sql)); //記錄總條數 //這句不要了if (!empty($_GET['page']) && $total != 0 && $curpage > ceil($total / $showrow))    $curpage = ceil($total_rows / $showrow); //當前頁數大於最後頁數,取最後一頁//擷取資料

就行了,應該能快很多

@incNick 謝謝你啊,神一樣的存在。
還有一點問題,一會兒等你吃完午飯再幫我看一下好嗎?

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.