<python/php>關於千萬級別數量的數據轉移更好的方案?

兩個項目,一個是舊的項目,後來重構了一個新的,資料庫表重新設計了,增加了一些新的表刪除了一些表,增加了一些表中新的欄位並刪除了一些舊的欄位,如果在做出了兩個資料庫分析以後

兩個問題

1.PHP先select出來在insert進去?這種方案可行嗎?

2.還有更好的方案嗎?

3.python會不會更快,有更好的開源庫?

----------------

問題補充:感謝大家的回答,補充幾點可能產生誤解的地方,資料庫是mysql

新舊項目的資料庫都是在線上的,每天都有用戶去使用的,目前我這邊是用觸發器去同步新舊資料庫,舊的資料庫之前遺留了很多用戶資料等信息,所以才需要轉移數據,可能不能對舊錶進行修改


今年早些時候干過這種事情,說一下心得和坑,因為沒有說使用了什麼資料庫,我就假設是mysql吧,因為我在mysql上做的數據遷移。

首先要說的是,我把「更好的方案」定義為如何在最短的時間內遷移完成,因為服務切換的時候,停服做數據遷移的時間越短越好。

1、如果可能,禁用掉buffered query,php端發起資料庫連接之後,可以設置禁用掉buffered query。如果不禁用掉,當你select * from 某個大表的時候,會發生內存溢出,無法查詢的問題。一旦禁用掉之後就沒有這個問題了。但是,一旦禁用掉buffered query之後,在這個select執行過程期間,你無法在這個連接上做其它的select/insert/update。所以,某些直接從老數據遷移到新數據的簡單任務可以這麼干,如果業務邏輯需要在轉換某個表的某行時,還需要查詢其它的表,就沒辦法了,這個很蛋疼。

2、如果目標資料庫做了主從,把主從停掉,遷移完畢之後再創建從資料庫。

3、如果能夠在資料庫內部直接完成的,不要用程序跑,盡量用資料庫sql。

4、先prepare一個statement,然後在循環里execute statement,比循環內每次都insert / update要快

5、開啟事務,寫入一個批次之後再提交,然後重新開事務寫下一個批次

6、在開始之前,drop掉index,完成後再恢復index

7、使用INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9)代替多條insert,可以獲得數量級的效率提升,這個和4有點衝突,根據實際情況取捨吧,7的效率提升大大高於4

8、INSERT ... ON DUPLICATE是個好東西

9、某些可以增量遷移的數據盡量寫成增量的形式,比如我們的評論表,預先跑了10幾個小時,正式遷移的時候只需要把半小時的新數據遷移過去就完了

10、某些計數器類型的數據,使用多條select ... group by,還不如直接用程序遍歷一次所有的數據,在內存中把計數器計算出來,然後再寫入資料庫,會更快

11、反覆的測試和琢磨


謝邀。

我先說說我個人的粗淺看法,等大神來指正

1和2:

具體問題具體分析,要看你兩個庫的差別有多大,刪除和添加欄位,添加和刪除表,這些操作本身可以在庫上直接操作,也就是說,你先備份出來一個測試庫,然後直接在測試庫上添加刪除欄位(或者表)(當然做成腳本運行也可以),然後有些新增欄位的值就用update添加就好了。

所以:沒有必要select然後再insert

3:沒有測試過哪個更快,感覺速度取決於你的資料庫速度


瀉藥。

我......我其實想說的是,一個千萬級,隨便折騰都不會出事的。當然首先做個備份是必須的。


1.從實現來說,PHP完全可行,注意控制數量就行

2.可以在1的基礎上使用CLI執行,分成多腳本進程並行運行

3.沒大差距,看你2種語言的熟練程度,其實主要效率瓶頸在資料庫讀寫性能


搞個臨時表,然後在表上處理欄位

瓶頸應該在資料庫上,與語言關係不大


推薦閱讀:

新手Python,如何系統的學習Python智能演算法?
在 PyCharm 中寫 pip 包應該如何處理引用問題?
怎樣搭建基於 Python 的科學計算、數據處理環境?
請問python theano中的shared variable是指什麼意思?
Python 最重要的庫都有哪些?

TAG:Python | PHP | Python庫 | 數據轉移 | 大數據 |