【发布时间】:2016-01-15 17:07:35
【问题描述】:
我在 MySQL 中有一个包含以下列的表:
id int(11)
contract_id int(11)
datetime datetime
open decimal(18, 10)
high decimal(18, 10)
low decimal(18, 10)
close decimal(18, 10)
该表相当大(> 3 亿行),但在数据库中进行的查询即使返回 300,000 行也会在半秒内执行。但是,当我从 Python 检索数据时,它非常慢(相同的请求从 MySQL Workbench 中的 0.5 秒到 Python 中的 34 秒):
import pandas as pd
import mysql.connector
con = mysql.connector.connect(**CONFIG)
cur = con.cursor()
def get_data1():
df = pd.read_sql(
"""
SELECT datetime, open, high, low, close
FROM prices
WHERE contract_id = 1
AND datetime >= '2015-01-01 09:00:00'
AND datetime <= '2015-10-15 16:00:00';
""", con)
return df
我发现将数据从 MySQL 导出到平面文件,然后在 Python 中读取它比直接查询数据库快 23 倍:
def get_data2():
cur.execute(
"""
SELECT datetime, open, high, low, close
FROM prices
WHERE contract_id = 1
AND datetime >= '2015-01-01 09:00:00'
AND datetime <= '2015-10-15 16:00:00'
INTO OUTFILE 'C:/Data/Temp.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY "\n";
""")
return pd.read_csv('C:/Data/Temp.csv')
怎么可能?我怀疑这与数据类型转换有关。知道如何使函数get_data1 更快,而不必先导出到 CSV?谢谢你。
【问题讨论】:
-
刚刚看到这个:stackoverflow.com/questions/8895837/faster-python-mysql,想知道它是否有帮助?另外,我看到您正在使用 mysql 连接器并调用
pd.read_sql...您是否尝试过使用带有较新功能的 sqlalchemy pandas.pydata.org/pandas-docs/stable/generated/… -
另外,我不得不尝试 sqlalchemy 的替代品,这里是我使用 mysql 连接器的示例:gist.github.com/msure/24ce45067d598fa7a5b6
-
谢谢,我会尝试,虽然我不希望它显着提高性能 - 我相信问题在于数据类型转换。