从MySQL获取表到Pandas的最快方法

时间:2017-06-19 15:45:21

标签: python mysql pandas

我正在尝试确定从MySQL获取数据到Pandas的最快方法。到目前为止,我尝试了三种不同的方法:

方法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 :(得分:0)

我认为您可以使用特定库(例如“peewee”)或pandas库中的函数df.read_sql_query找到答案。要使用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.to_sql([TableName], MyEngine, if_exists = 'append', index=False)

如果表已经存在,则必须将if_exists ='append'置换,否则它将自动默认为失败。如果您想要替换为新表,也可以放置替换。

为了数据完整性,使用数据帧进行上传和下载很好,因为它能够很好地处理数据。根据您上传的大小,上传时间也非常有效。

如果你想采取额外步骤,虽然我没有亲自测试速度,但是peewee查询可能有助于提高上传时间。 Peewee是一个像SQLAlchemy这样的ORM库,我发现它非常容易和富有表现力。 您也可以使用数据帧。只需略过文档 - 您将构建并分配一个查询,然后将其转换为如下数据框:

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

希望这会有所帮助。

答案 1 :(得分:0)

您可以使用用 rust 编写的 ConnectorX 库,该库比 Pandas 快 10 倍左右。 该库从数据库中获取数据并填充数据框。请注意,目前仅支持 PostgreDB。