一、須要頻繁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