2015-10-16 269 views
2

我有一个表在MySQL包含以下几列:优化的Python的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) 

表是相当大(> 300百万行),但查询数据库内进行的半年内执行即使他们返回30万行时也是如此。然而,当我从Python中获取数据是很慢的(相同的请求,从0.5秒变为在MySQL Workbench中,以34秒在Python):

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?谢谢。

+0

刚刚看到这个:http://stackoverflow.com/questions/8895837/faster-python-mysql,并想知道是否有帮助? 另外,我看到你正在使用mysql连接器并调用'pd.read_sql' ...你有没有尝试过使用新功能sqlalchemy http://pandas.pydata.org/pandas-docs/stable/generated/pandas .read_sql_query.html – measureallthethings

+0

此外,我不得不尝试替代sqlalchemy,这里是我使用mysql连接器的一个例子:https://gist.github.com/msure/24ce45067d598fa7a5b6 – measureallthethings

+0

谢谢,我会尝试,虽然我不认为它会显着提高性能 - 我相信这个问题出现在数据类型转换中。 – agiap

回答

0

以下溶液3倍比初始一个更快(12S与34S):

import mysql.connector 
con = mysql.connector.connect(**CONFIG) 
cur = con.cursor() 
class MySQLConverter(mysql.connector.conversion.MySQLConverter): 
    def _DECIMAL_to_python(self, value, desc=None): 
     return float(value) 
    _NEWDECIMAL_to_python = _DECIMAL_to_python 

con.set_converter_class(MySQLConverter) 

它可以转换的MySQL小数类型成Python浮decimal.Decimal,这是更快的代替。它仍然比完成1.57秒的“CSV解决方案”慢得多。仍在挖...