背景
在利用python連接mysql庫下載數(shù)據(jù)時,用傳統(tǒng)的fetch方式步咪,在數(shù)據(jù)量達到百萬級后论皆,往往要等待很長很長時間,才能把數(shù)據(jù)全部加載完』現(xiàn)在点晴,本文將介紹一種更為快速高效的方式來下載數(shù)據(jù)。
傳統(tǒng)方式
用python的pymysql包來獲取數(shù)據(jù)庫連接静袖,并讀取數(shù)據(jù)觉鼻。
見代碼示例:
conn = getMysqlConn() # 獲取mysql連接的方法
cursor = conn.cursor()
stmt = """select * from TABLE_NAME """
cursor.execute(stmt)
for f in cursor.fetchall():
# 加載數(shù)據(jù)
pass
優(yōu)化方式
用mysql的指令將下載到本地,再去加載文件队橙。
指令如下:
mysql -h10.xx.232.xxx -uroot -p123456 -P3306 -A database_name --default-character-set=utf8 -ss -e "select * from table_name " > /data/xxx/download.csv
(mysql的ip, port, 數(shù)據(jù)庫名信息按實際情況填寫)
效率對比
60個字段的表結(jié)構(gòu)坠陈,下載時間對比:
數(shù)據(jù)量 | 原始下載方式 | mysql指令下載 |
---|---|---|
40w | 137秒 | 9秒 |
560w | 2645秒 | 224秒 |
(注:上述時間包含了下載數(shù)據(jù)+加載到內(nèi)存)
結(jié)論
直接使用mysql指令下載數(shù)據(jù)萨惑,全方位的領(lǐng)先于直接使用python的fetch方式,在數(shù)據(jù)量較大時仇矾,可以考慮使用這種方式來進行數(shù)據(jù)讀取庸蔼。