2015-10-16 268 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解決方案」慢得多。仍在挖...