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

San*_*wal 6 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)
Run Code Online (Sandbox Code Playgroud)

方法二:使用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)
Run Code Online (Sandbox Code Playgroud)

方法三:使用sqlalchemy

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

方法 2 是这三种方法中最好的,平均需要 4 秒才能获取我的表。但是,在 MySQL Workbench 上获取表只需要 2 秒。我怎样才能减少这 2 秒的额外时间?有谁知道任何替代方法来实现这一目标?

小智 1

我认为您可能会使用特定的库(例如“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)
Run Code Online (Sandbox Code Playgroud)

另外,要将数据从数据帧上传到 SQL:

df.to_sql([TableName], MyEngine, if_exists = 'append', index=False)
Run Code Online (Sandbox Code Playgroud)

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

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

如果您想采取额外的步骤,peewee 查询可能有助于加快上传时间,尽管我没有亲自测试过速度。Peewee 是一个像 SQLAlchemy 一样的 ORM 库,我发现使用它进行开发非常简单且富有表现力。您也可以使用数据框。只需浏览一下文档 - 您将构建并分配一个查询,然后将其转换为如下数据框:

MyQuery = [TableName]select()where([TableName.column] == "value")
df = pd.DataFrame(list(MyQuery.dicts()))
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。