python導資料的時候,需要在乙個大表上讀取很大的結果集。
如果用傳統的方法,python的記憶體會爆掉,傳統的讀取方式預設在記憶體裡快取下所有行然後再處理,記憶體容易溢位
解決的方法:
1)使用sscursor(流式游標),避免客戶端占用大量記憶體。(這個cursor實際上沒有快取下來任何資料,它不會讀取所有所有到記憶體中,它的做法是從儲存塊中讀取記錄,並且一條一條返回給你。)
2)使用迭代器而不用fetchall,即省記憶體又能很快拿到資料。
import mysqldb.cursors
conn = mysqldb.connect(host='ip位址', user='使用者名稱', passwd='密碼', db='資料庫名', port=3306,
charset='utf8', cursorclass = mysqldb.cursors.sscursor)
cur = conn.cursor()
cur.execute("select * from bigtable");
row = cur.fetchone()
while row is not none:
do something
row = cur.fetchone()
cur.close()
conn.close()
需要注意的是,
1.因為sscursor是沒有快取的游標,結果集只要沒取完,這個conn是不能再處理別的sql,包括另外生成乙個cursor也不行的。
如果需要幹別的,請另外再生成乙個連線物件。
2. 每次讀取後處理資料要快,不能超過60s,否則mysql將會斷開這次連線,也可以修改 set net_write_timeout = xx 來增加超時間隔。
MySQL 對於千萬級的大表的優化?
第一 優化你的sql和索引 第二 加快取,memcached,redis 第三 以上都做了後,還是慢,就做主從複製或主主複製,讀寫分離,可以在應用層做,效率高,也可以用三方工具,第三方工具推薦360的atlas,其它的要麼效率不高,要麼沒人維護 第四 如果以上都做了還是慢,不要想著去做切分,mysq...
千萬級的大表!MySQL這樣優化更好
對於乙個千萬級的大表,現在可能更多的是億級資料量,很多人第一反應是各種切分,可結果總是事半功倍,或許正是我們優化順序的不正確。下面我們來談談怎樣的優化順序可以讓效果更好。mysql資料庫一般都是按照下面的步驟去演化,成本也是由低到高 1.避免使用select 2.可確定返回記錄數的,盡量增加limi...
千萬級的大表!MySQL這樣優化更好
對於乙個千萬級的大表,現在可能更多的是億級資料量,很多人第一反應是各種切分,可結果總是事半功倍,或許正是我們優化順序的不正確。下面我們來談談怎樣的優化順序可以讓效果更好。mysql資料庫一般都是按照下面的步驟去演化,成本也是由低到高 1.避免使用select 2.可確定返回記錄數的,盡量增加limi...