Python 頻繁讀取Mysql相關問題

一、須要頻繁select大量數據,時間長、消耗內存大,如何解決mysql性能問題?python

若是對返回的結果數量沒有要求,能夠控制返回的數量:mysql

cursor.fetchmany(size=1000)sql

這樣是隻返回1000條數據,若是返回的結果小於size,則返回全部數據;數據庫

若是你只須要一條,則更簡單:fetchone()多線程

二、每次插入的數據過大,MySQL server has gone away 如何解決?性能

存儲爲blob類型;fetch

修改my.conf裏:max_allowed_packet = 500mspa

三、要把python的list類型存入mysql,而後下次還須要以list格式讀取,如何操做?線程

由於list類型裏包含半角的逗號,或插入的數據裏包含特殊符號,則不能正常插入mysql。code

Google裏有不少方法,我採起的是base64。將要插入的數據base64 encode能夠正常存入Mysql。

base64str = base64.b64encode(str(mysqlstr))

mysqlstr = base64.b64decode(b64str)

注意:當你讀取的時候,須要base64decode,這時獲得的是str,則不能正常使用list序列取值。怎麼辦?

eval(string)

如上操做,eval能夠很好的解決這個問題,把str變成tuple,就能夠直接用了。

四、頻繁操做Mysql更刪查數據時,最好採用多線程操做數據庫,避免由於my.conf配置問題帶來的麻煩。

下面是一個Mysql多線程操做類:

 1 class MYSQL:  2     def __init__(self,sql):  3         self.sql = sql  4         self.conn = MySQLdb.connect(charset='utf8',user='yourname',passwd='passwd',db='your dbname')  5         self.cursor = self.conn.cursor()  6  
 7     def insert(self):  8  self.cursor.execute(self.sql)  9  self.conn.commit() 10  self.cursor.close() 11  self.conn.close() 12         return True 13  
14     def select(self): 15  self.cursor.execute(self.sql) 16         alldata = self.cursor.fetchall() 17  self.cursor.close() 18  self.conn.close() 19         return alldata 20  
21     def update(self): 22  self.cursor.execute(self.sql) 23  self.conn.commit() 24  self.cursor.close() 25  self.conn.close() 26         return True
相關文章
相關標籤/搜索