mysql_unbuffered_query的_用mysql_unbuffered_query函数取大数据
昨天在做項目的時候,因為涉及到數據表結構的改動,需要進行大量數據的導入,那么如何高效的進行是我比較關注的。本文暫且從使用PHP腳本層面上來說,因為使用其他語言或其他方式也可以進行數據的重導。 在討論這個問題的時候,前輩給我的意見就是單獨做一個腳本,如果能拿python做更好,當然,python我還不是很會,所以拿php也能完成。既然這樣,就采用最原生的方式來進行數據的重導。 整個過程中要先從一張表中取出全部數據,再進行數據的處理后導入到新的數據表中。而就我測試的那個數據庫中的那張表里,數據量就已經上萬了,如果直接全部取出必定會有性能上的問題。 他人給我的建議是,使用mysql_connect后用mysql_query執行sql(取大數據的情況如sele ct * from tbl)語句,理由是mysql_query不是返回的數據結果,因為后面用到mysql_fetch_assoc之類的函數,進行游標的移動來取得數據。并在sql執行前后分別使用了memory_get_usage來查看內存使用量。當然,執行后內存使用量比執行前大了,雖然使用了不多的內存,但對于只是測試數據庫里的數據而言還行,當數據處理量很大的時候,php程序腳本可能會崩潰。為了確保重導真正線上數據庫的數據萬無一失,我還是查了一些相關資料。 最后了解到PHP中有個mysql_unbuffered_query這個函數,與mysql_query有點類似,手冊上寫了該函數不緩存的查詢結果,它所帶來的好處就是一不用緩存結果,二就是不必等待全部查詢后進行操作,而是直接獲取一條數據就可以操作。而mysql_query是查詢出所有符合條件的結果并緩存后才能進行操作,這就讓我懷疑之前建議的那個方法。 于是我同樣用mysql_unbuffered_query查詢同樣一條sql語句,也同樣對執行前后查看了內存使用量,結果前后內存使用量沒有變,這就說明了內存并沒有被拿來做查詢數據緩存的相關事情。當然也可以使用以下方法來測試:
$link = mysql_con nect(‘localhost’,’root’,’root’);
mysql_select_ db(‘phpcms’);
$sql = “SEL ECT * FROM `phpcms_content`“;
//$result = mysql_unbuffered_query($sql,$link);
$result = mysql_query($sql,$link);
while ($row = mysql_fe tch_array($result, MYSQL_NUM)) {
printf (“ID: %s Name: %s”, $row[0], $row[1]);
}
mysql_data_seek($result,0);
echo “
“;
while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
printf (“ID: %s Name: %s”, $row[0], $row[1]);
}
mysql_free_result($result);
你會發現使用mysql_query會輸出兩次,而mysql_unbuffered_query只輸出一次,說明使用mysql_query查詢結果必定被緩存了,而使用mysql_unbuffered_query則邊進行查詢邊給出結果。 最后再說明,使用mysql_unbuffered_query的話,不能使用mysql_num_rows()和mysql_data_seek()這也正因為它的特性方式決定了這樣。還有比較重要的一點,如果你只是單單獲取大數據量使用這個函數可以,但是,如果你在取得大數據的時候,使用while($row = mysql_fetch_assoc($result))方式進行執行新的sql語句的話,會出錯。手冊上也寫明了,在執行一條心的sql之前,要提取所有未緩存的sql查詢所產生的行。所以只使用mysql_unbuffered_query取數據可以,但期間還要執行其他sql就不行了。 以上只是我對這個函數的初步認識,如果理解有誤,也希望能指正交流。
總結
以上是生活随笔為你收集整理的mysql_unbuffered_query的_用mysql_unbuffered_query函数取大数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用php,使用 PHP
- 下一篇: mysql not in报错_mysql