在通過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)
通過這樣的操作,我們就能避免因為對大表進行增刪查改操作而導致因為一次性返回所有結果造成的效率低下以致記憶體** MySQL 對於千萬級的大表優化流程
第一優化你的sql和索引 第二加快取,memcached,redis 第三以上都做了後,還是慢,就做主從複製或主主複製,讀寫分離,可以在應用層做,效率高,也可以用三方工具,第三方工具推薦360的atlas,其它的要麼效率不高,要麼沒人維護 第四如果以上都做了還是慢,不要想著去做切分,mysql自帶分...
pymysql常用操作
插入操作 import pymysql 開啟資料庫連線 db pymysql.connect host localhost user root password 123456 db python port 3306 使用cursor 方法獲取操作遊標 cursor db.cursor 插入資料 編寫...
PyMySQL基本操作
pymysql 是在 python3.x 中連線mysql伺服器的一個庫 純python實現 python2 中使用 mysqldb pip install pymysql執行dql語句 coding utf 8 import pymysql conn pymysql.connect host 19...