最近因業務需求需要重新整理線上的資料,遇到幾個問題。
原本想著線上的資料量也沒有多少,在取資料的時候就沒有分批次取,將所有的資料拿出來,在mysql將所有的資料給php之後,因為php設定的記憶體最大容量有限,所以記憶體直接溢位了。
因為是對原有的資料表進行操作,所以需要將原來的表備份,以便出了問題還原
drop table if exists a_bak;
create table a_bak like a;
insert into a_bak select * from a;
線上資料大約有七萬條,不到一秒就執行完了,還是相當快的
同事說他們之前刷資料的時候,都是寫乙個shell指令碼,shell指令碼每次獲取表的50條資料,呼叫另乙個php指令碼,來對這50條資料進行操作;用nohup命令不間斷的執行這個shell指令碼。
nohup 命令執行由 command引數和任何相關的 arg引數指定的命令,忽略所有結束通話(sighup)訊號。在登出後使用 nohup 命令執行後台中的程式。要執行後台中的 nohup 命令,新增 & ( 表示「and」的符號)到命令的尾部。
nohup命令:如果你正在執行乙個程序,而且你覺得在退出帳戶時該程序還不會結束,那麼可以使用nohup命令。該命令可以在你退出帳戶/關閉終端之後繼續執行相應的程序。
在預設情況下該作業的所有輸出都被重定向到乙個名為nohup.out的檔案中。
nohup command > myout.file 2>&1 &
後台不間斷執行command命令,(2>&1是將標準錯誤(2)重定向到標準輸出(&1),標準輸出(&1)再被重定向輸入到myout.file檔案中)。並將命令執行結果重定向到myout.file檔案中。
我線上資料大約有7萬條,但是執行了將近一分鐘,運算元據庫和邏輯處理也不複雜,但是執行這麼久,確實是存在問題的。
在程式中對錶中的資料進行了分批次獲取,每次獲取50條,使用的是框架自帶的方法,用的是limit-offset方法,但是當快查到最後幾頁的時候,就會非常慢;可以再每次獲取的資料上記錄最後一條的id,然後根據id倒排,取前50條,就能優化上述的問題。
在程式中每次形成新的記錄時,都插入資料庫,所以是單條插入的,但是mysql每次插入時(innodb引擎)都會更新索引,資料量越大,更新索引需要的時間就越多,所以插入速度就越慢;可以在匹配取出50條之後批量插入資料庫,這樣50條資料才執行一次插入,執行一次索引更新,速度就會提公升。
可以了解一下mysql的游標的使用
記一次線刷經歷
前幾日,受兄弟委託,讓我幫他的遠古手機 紅公尺1s移動3g版 刷機。由於很久沒有搞過了,所以又經歷了很長的看教程,找資源環節,最終不僅完美的幫他解決了問題,還鞏固了刷機技術,雖然可能以後都不會在用到了,但是還是記下來吧,畢竟查了這麼久資料,然後在忘記了,那豈不是很虧。主要步驟 由於win10系統不知...
記一次失敗的面試經歷
背景 面試者 王某 以下簡稱我 嵌入式行業剛入門 10年工作經歷 從事方向為 gps bd導航,物聯網,車聯網方向 面試官 前華為員工 3年工作經驗,現為1 創業公司嵌入式部門leader,公司已獲得風投注資500w rmb,產品方向為物聯網和小眾市場產品。面試地點 陝西某眾創空間 職位 高階嵌入式...
記一次失敗的買房經歷
最近在買房,一提到房子,中國人民都感興趣 來蘇州工作快一年了,正好限購也結束了,最近一兩個月一直在看房 看了好多二手房,心真的叫乙個累啊 要麼價錢不怎們合適 要麼位置比較偏 要麼比較老舊 你可以想象乙個姑娘騎著電瓶車週末兩天都去看房 那真叫乙個累啊 看了房子多了,就慢慢知道房價區域的 就慢慢知道中介...