MySQL下海量數據的遷徙步調分享。本站提示廣大學習愛好者:(MySQL下海量數據的遷徙步調分享)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL下海量數據的遷徙步調分享正文
公司數據中間籌劃將海量數據做一次遷徙,同時增長某時光字段(本來是datatime類型,如今增長一個date類型),單表數據量到達6億多筆記錄,數據是基於時光(月)做的partition因為比擬忙,一向沒有總結,所以很細節的處所都記不清晰了,此處只是簡略總結下其時的情況,備忘
亂打亂闖
最後接就任務,沒有明白的動手點,直接就是select * from db limit 10000,靜態修正翻頁數目,經由過程掌握台看耗時情形,慢
SELECT IR_SID,IR_HKEY,IR_GROUPNAME,IR_SITENAME,IR_CHANNEL,IR_MID,IR_URLNAME,IR_STATUS_CONTENT,IR_CREATED_AT,date_format(IR_CREATED_AT,'%Y.%m.%d'),IR_LASTTIME,IR_VIA,IR_THUMBNAIL_PIC,IR_RTTCOUNT,IR_COMMTCOUNT,IR_UID,IR_SCREEN_NAME,IR_RETWEETED_UID,IR_RETWEETED_SCREEN_NAME,IR_RETWEETED_MID,IR_RETWEETED_URL,IR_STATUS_BODY FROM TB_SINA_STATUS WHERE IR_SID>40000 AND IR_SID<50001 INTO OUTFILE '/home/mysql/data/data_outfile.txt'; LOAD DATA INFILE '/home/mysql/data/data_outfile.txt' INTO TABLE NEW_TB_SINA_STATUS;
能否可以基於partition讀數據呢
既然數據庫是按partition做分區,能否可以按partition讀數據呢,假如可以改用如何的語法讀呢?時光上只需按月讀數據,mysql會主動的基於partition讀,詳細可以用敕令:explain partition便可看到具有基於哪一個partition
讀年夜數據會非常耗時,關於數據停止到甚麼狀況,我們能夠非常想懂得,可以用敕令:show status檢查,我印象中重要是sending data,writting to net之類的。
innodb引擎的機能較myIsam引擎究竟若何?
導庫試驗中導出並導入一個月的數據(8G的文本量,2500w筆記錄),在myisam引擎下須要不到4h(測試情況為pc機),然則在innodb引擎下,卻須要32小時,改良索引之類的,也須要28h,機能有8倍之差。
在網上找到了高人關於innodb與myisam差別,說須要修正innodb_buffer_pool_size、innodb_flush_log_at_trx_commit
可包管沒有太年夜差異,測驗考試了沒有顯著改良,在本機卻是可以,為何呢???這個折騰了我好長時光
innodb_flush_log_at_trx_commit
能否為Innodb比MyISAM慢1000倍而頭年夜?看來或許你忘了修正這個參數了。默許值是 1,這意味著每次提交的更新事務(或許每一個事務以外的語句)都邑刷新到磁盤中,而這相當消耗資本,特別是沒有電池備用緩存時。許多運用法式,特別是從 MyISAM改變過去的那些,把它的值設置為 2 便可以了,也就是不把日記刷新到磁盤上,而只刷新到操作體系的緩存上。日記依然會每秒刷新到磁盤中去,是以平日不會喪失每秒1-2次更新的消費。假如設置 為 0 就快許多了,不外也絕對不平安了 — MySQL辦事器瓦解時就會喪失一些事務。設置為 2 只會喪失刷新到操作體系緩存的那部門事務。
innodb_buffer_pool_size
Innodb在默許的 innodb_buffer_pool_size 設置下跟蝸牛似的。因為Innodb把數據和索引都緩存起來,無需留給操作體系太多的內存,是以假如只須要用Innodb的話則可以設置它高達 70-80% 的可用內存。
最初含辛茹苦的、四處奔波的,找到了別的兩個參數
innodb_log_file_size
在高寫入負載特別是年夜數據集的情形下很主要。這個值越年夜則機能絕對越高,然則要留意到能夠會增長恢復時光。我常常設置為 64-512MB,跟據辦事器年夜小而異。
innodb_log_buffer_size
默許的設置在中等強度寫入負載和較短事務的情形下,辦事器機能還可以。假如存在更新操作峰值或許負載較年夜,就應當斟酌加年夜它的值了。假如它的值設置太高了,能夠會糟蹋內存 — 它每秒都邑刷新一次,是以無需設置跨越1秒所需的內存空間。平日 8-16MB 就足夠了。越小的體系它的值越小。
終究弄定,myisam與innodb的導數據的機能根本分歧,2500的數據約須要3.5h,單庫讀數據須要2h,這個只是一個表示值僅供參考(pc上的測試),正式辦事的上的測試成果加倍顯著
機能調優語句參考
set profiling = 1;
show profiles\G
SHOW profile CPU,BLOCK IO io FOR query 1;
show status
Show Processlist
explain
並行讀取能否會更快?
假如基於partition導數據,照樣不克不及到達既定目的,我終究是經由過程編寫shell腳步,多過程並行基於partition導數據,即啟動多個mysql -uroot -p db < exp201201.sql 、mysql -uroot -p db < exp201202.sql,每一個sql下按天做讀寫(事宜情況下是按月做partition的)
SELECT IR_SID,IR_HKEY,IR_GROUPNAME,IR_SITENAME,IR_CHANNEL,IR_MID,IR_URLNAME,IR_STATUS_CONTENT,IR_CREATED_AT,date_format(IR_CREATED_AT,'%Y.%m.%d'),IR_LASTTIME,IR_VIA,IR_THUMBNAIL_PIC,IR_RTTCOUNT,IR_COMMTCOUNT,IR_UID,IR_SCREEN_NAME,IR_RETWEETED_UID,IR_RETWEETED_SCREEN_NAME,IR_RETWEETED_MID,IR_RETWEETED_URL,IR_STATUS_BODY
INTO OUTFILE '/home/mysql/data/sinawb20120724/111101.txt'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\\'
LINES TERMINATED BY '\n'
FROM TB_SINA_STATUS
WHERE ir_created_at >='2011-11-01 00:00:00' and ir_created_at <'2011-11-01 23:59:59'
LOAD DATA LOCAL INFILE '/home/mysql/data/sinawb20120724/111101.txt'
IGNORE INTO TABLE `NEW_TB_SINA_STATUS`
CHARACTER SET UTF8
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\\'
LINES TERMINATED BY '\n'