程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL下海量數據的遷徙步調分享

MySQL下海量數據的遷徙步調分享

編輯:MySQL綜合教程

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'

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved