本地安裝的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 謝謝你啊,神一樣的存在。
還有一點問題,一會兒等你吃完午飯再幫我看一下好嗎?