2017-06-19 45 views
3

我想確定從MySQL獲取數據到熊貓的最快方式。到目前爲止,我曾嘗試三種不同的方法:從MySQL獲取表格到熊貓的最快方法

方法1:使用pymysql和修改字段類型(由Fastest way to load numeric data into python/pandas/numpy array from MySQL啓發)

import pymysql 
from pymysql.converters import conversions 
from pymysql.constants import FIELD_TYPE 
conversions[FIELD_TYPE.DECIMAL] = float 
conversions[FIELD_TYPE.NEWDECIMAL] = float 
conn = pymysql.connect(host = host, port = port, user= user, passwd= passwd, db= db) 

方法2:使用MySQLdb的

import MySQLdb 
from MySQLdb.converters import conversions 
from MySQLdb.constants import FIELD_TYPE 
conversions[FIELD_TYPE.DECIMAL] = float 
conversions[FIELD_TYPE.NEWDECIMAL] = float 
conn = MySQLdb.connect(host = host, port = port, user= user, passwd= passwd, db= db) 

方法3:使用sqlalchemy

import sqlalchemy as SQL 
engine = SQL.create_engine('mysql+mysqldb://{0}:{1}@{2}:{3}/{4}'.format(user, passwd, host, port, db)) 

方法2是最好的這些三次,平均需要4秒才能拿到我的桌子。但是,在MySQL Workbench上取表只需要2秒鐘。我怎樣才能削減這2多秒?有誰知道任何替代方法來完成這個?

+0

你是什麼意思?「但是,MySQL只讀取表格需要2秒。」?你已經連接到MySQL了嗎? –

+0

對不起,我的意思是當我在MySQL工作臺上運行SELECT * FROM表時,只需2秒即可獲取表 –

+0

這意味着您已連接到數據庫。當基準測試不同的方法時,是否排除了連接到數據庫所需的時間? –

回答

0

我想你可能會找到答案使用特定庫,如「peewee」或從熊貓庫函數df.read_sql_query。此外

MyEngine = create_engine('[YourDatabase]://[User]:[Pass]@[Host]/[DatabaseName]', echo = True) 
df = pd.read_sql_query('select * from [TableName]', con= MyEngine) 

,用於從數據幀將數據上傳到SQL:要使用df.read_sql_query

df.to_sql([TableName], MyEngine, if_exists = 'append', index=False) 

你必須把if_exists =「追加」如果該表已經存在,否則它會自動 - 默認爲失敗。如果您想要替換爲新表格,也可以放置替換。

出於數據完整性的考慮,使用數據幀進行上傳和下載是很好的,因爲它能夠很好地處理數據。根據您的上傳大小,上傳時間也應該非常高效。

如果您想要多走一步,peewee查詢可能有助於縮短上傳時間,但我沒有親自測試過速度。 Peewee是一個像SQLAlchemy這樣的ORM庫,我發現它非常容易和富有表現力。 你也可以使用數據框。只是略過了文檔 - 你會構造並分配一個查詢,然後將其轉換爲這樣的數據框:

MyQuery = [TableName]select()where([TableName.column] == "value") 
df = pd.DataFrame(list(MyQuery.dicts())) 

希望這有助於。