pymysql对于大表操作的优化

pymysql对于大表操作的优化

在通过pymysql操作mysql的过程中,我们有时候往往会需要只读取少部分数据

我们往往会直接采取fetchone这个方法来获取一条数据,就像下列代码所示

 import pymysql
  conn = pymysql.connect(host='localhost',
                               user='user',
                               password='passwd',
                               db='db',
                               port=3306,
                               charset='utf8mb4')
cursor = conn.cursor()
sql = "select * from table"
cursor.execute(sql)
one_row = sql.fetchone()
print(one_row)

但是,实际上这段代码等效于下面这段代码

import pymysql
  conn = pymysql.connect(host='localhost',
                               user='user',
                               password='passwd',
                               db='db',
                               port=3306,
                               charset='utf8mb4')
cursor = conn.cursor()
sql = "select * from table"
cursor.execute(sql)
all_row = sql.fetchall()
print(all_row[0])

实际上,当我们执行cursor.execute(sql)的时候,pymysql就会将所有返回结果都读入内存,后面的fetchall和fetchone不过是将内存中的数据取出,并没有什么本质区别

在面对大表的时候,我们不能直接采用这种方式进行数据的获取,会直接将个人电脑的内存撑爆

所以,单纯使用fetchone这个方法并不能减少pymysql对于电脑内存的占用

真正的解决办法在于使用pymysql.cursors.SSDictCursor这个类来代替默认的cursor类型

使用办法如下

import pymysql 
conn = pymysql.connect(host='localhost',
  user='user',
  password='passwd',
  db='db',
  charset='utf8mb4',
  cursorclass=pymysql.cursors.SSDictCursor) 
with conn.cursor() as cursor:
  sql ='select * from table'
  cursor.execute(sql)
  for one_row in cursor:
  print(one_row)

通过这样的操作,我们就能避免因为对大表进行增删查改操作而导致因为一次性返回所有结果造成的效率低下以致内存爆炸

posted @ 2020-10-28 22:32  -拂石-  阅读(254)  评论(0)    收藏  举报