关于处理百万级大批量数据的mysql运行几个重要点
處理大批量百萬級的數據幾點重要知識點:
一:設置php運行的內存配置?ini_set("memory_limit","1200M");
在php.ini中有如下配置
; Maximum input variable nesting level
; http://php.net/max-input-nesting-level
;max_input_nesting_level = 64
; How many GET/POST/COOKIE input variables may be accepted
; max_input_vars = 1000
; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = 100M
會有一個默認的配置,導致運行到一定數量的時候,報錯,無法運行下去。
二:設置腳本最大執行時間?set_time_limit?(?int?$seconds?)
方法具體詳情
?
三:不設置緩存結果?mysql_unbuffered_query
在處理大批量數據的時候優勢非常大,
(PHP 4 >= 4.0.6, PHP 5)
mysql_unbuffered_query?—?向 MySQL 發送一條 SQL 查詢,并不獲取和緩存結果的行
說明
resource?mysql_unbuffered_query?(?string?$query?[,?resource?$link_identifier?] )mysql_unbuffered_query()?向 MySQL 發送一條 SQL 查詢?query,但不像?mysql_query()?那樣自動獲取并緩存結果集。一方面,這在處理很大的結果集時會節省可觀的內存。另一方面,可以在獲取第一行后立即對結果集進行操作,而不用等到整個 SQL 語句都執行完畢。當使用多個數據庫連接時,必須指定可選參數?link_identifier。
Note:
mysql_unbuffered_query()?的好處是有代價的:在?mysql_unbuffered_query()?返回的結果集之上不能使用mysql_num_rows()?和?mysql_data_seek()。此外在向 MySQL 發送一條新的 SQL 查詢之前,必須提取掉所有未緩存的 SQL 查詢所產生的結果行。
參見?mysql_query()
?
四:取消變量緩存 unset($x)
在循環的結束環節,使用unset方法釋放變量占用的內存。
?
?
具體代碼例子(使用pdo):
$pdo = new PDO("mysql:host=127.0.0.1;dbname=aa","root","root"); $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false); ini_set("memory_limit","1200M"); set_time_limit(0);$sql = 'select url,num from cas_key limit 100000 '; $rs = $pdo->query($sql);while($value = $rs->fetch()){unset($xxx);unset($xxx);unset($xxx); } var_dump(memory_get_usage());//查看內存占用方法?
?
?
如有更多優化方法,歡迎請教指點!
?
?
?
?
轉載于:https://www.cnblogs.com/fpcing/p/7249818.html
總結
以上是生活随笔為你收集整理的关于处理百万级大批量数据的mysql运行几个重要点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 几家大的券商的PB系统以及算法交易概况大
- 下一篇: SQL强化(二) 在Oracle 中写代