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
相关文章
相关标签/搜索