最近有一張2000w條記錄的資料表需要優化和遷移。2000w資料對於mysql來說很尷尬,因為合理的建立索引速度還是挺快的,再怎麼優化速度也得不到多大提公升。不過這些資料有大量的冗餘欄位和錯誤資訊,極不方便做統計和分析。所以我需要建立一張新錶,把舊表中的資料一條一條取出來優化後放回新表;
2000w資料中,能作為查詢條件的字段我們是預知的。所以將這部分資料單獨建立新的字段,對於有規則的資料合理改變字段結構,比如身份證就是varchar(18)。對於不重要的資料我們合併後存在乙個結構為text的字段。
對於一些有關聯的資料我們需要計算,常見的比如身份證種能獲取到準確的性別,出生地、生日、年齡。
我們從資料庫中取出一條舊資料,再通過計算處理後得到想要的新資料,最後將新資料插入新錶。不過在獲取新資料時遇到如下問題。
資料量太大,無法一次獲取(2000w資料扔到記憶體挺可怕的);
我們可以通過mysql的limit語法分批獲取。比如每次獲取50000,sql語句如下:
select * from table_name limit 15000000,50000;
通過這種方法能解決資料量太大的問題,但是隨著limit的第乙個引數越來越大,查詢速度會慢的嚇人(上面這條sql執行會花35秒)。時間就是生命,於是我們開始優化sql語句,優化後變成下面這樣:
select * from table_name order by id desc limit 5000000,50000;
可通過二分法拆分2000w資料,當執行到1000w資料時,將資料倒序。優化後sql執行效率顯著提公升,從35秒降到9秒;
不過還是很慢,時間就是生命……還好我們有自增id(建立資料表第一條定律,一定要有自增欄位),優化後的sql如下:
1. select * from table_name where id>15000000 and id<15050000;
2. select * from table_name where id>15000000 limit 50000;
為了直觀演示,我寫了兩條功能一樣的sql。相比第一條,第二條的limit會導致sql的索引命中變差,效率同樣也會下降。第一條sql的執行時間是2毫秒,第二條執行時間5毫秒(我取的平均值)。每次資料的查詢速度直接從35秒降到2毫秒……
資料量太大並且資料無法預估,某些特殊資料會導致資料匯入失敗;
我們有三種方案去將新資料存入新錶,分別如下:
一條一條插入資料;
開始肯定會想這種方案一定不行,因為每次插入都會有一次資料庫io操作。但是該方案有個好處是能及時發現有問題的資料,修改後再繼續執行; 在oracle中使用『繫結變數』能帶來效能提公升,正好mysql也提供了『繫結變數』的功能。於是在不改變邏輯的情況下,嘗試優化資料儲存速度。**如下:
public function actiontest(array $data)
$stmt->close();
}
最後效果不怎麼好,mysql的『繫結變數』並沒帶來明顯的速度提公升,不過能有效的防止sql注入;
一次插入50000條資料;
這是我最後選中的方案,一是能及時發現有問題的資料,二是匯入資料非常穩定。就像支援斷點續傳一樣,每一步都能看到效果。在執行指令碼時,也能同步開始寫分析邏輯;
組裝成sql檔案,最後統一匯入;
組裝乙個大的sql檔案,最後通過mysql自帶的工具匯入也是極好的。但如果有一條sql有問題,你可能需要重跑一次指令碼。因為在9g大小的文字檔案中修改乙個符號是很痛苦的事情……
通過各種優化,最後將指令碼執行時間縮短到了20分鐘內。優化後資料質量得到了較高保證,下次將嘗試2億資料的優化&遷移……
MySQL兩千萬資料優化 遷移
最近有一張2000w條記錄的資料表需要優化和遷移。2000w資料對於mysql來說很尷尬,因為合理的建立索引速度還是挺快的,再怎麼優化速度也得不到多大提公升。不過這些資料有大量的冗餘欄位和錯誤資訊,極不方便做統計和分析。所以我需要建立一張新錶,把舊表中的資料一條一條取出來優化後放回新表 一.清除冗餘...
YY直播被判賠款兩千萬,遊戲直播也會侵犯著作權?
遊戲直播或直播遊戲,會侵犯遊戲作品的著作權?日前,廣州智財權法院對廣州網易計算機系統 以下簡稱網易公司 訴廣州華多網路科技有限公aasmlydsi司 以下yy直播或yy 侵害著作權案作出一審判決,判決被告停止通過網路傳播 夢幻西遊 或 夢幻西遊2 的遊戲畫面,並賠償原告經濟損失 2000 萬元。作為...
08年約兩千萬農民工因金融危機失去工作返鄉
國新辦2月2日上午舉行新聞背景吹風會,請 財經領導小組辦公室副主任 農村工作領導小組辦公室主任陳錫文介紹保持農業穩定發展,促進農民持續增收等方面情況,並回答記者提問。關於過去一年間有多少農民工在城市地區失去了工作,被迫返鄉的問題,陳錫文表示,在一億三千萬外出就業的農民工中,總量來看有15.3 大約兩...