2017-06-19 71 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())) 

希望这有助于。