pandas read_sql异常缓慢

时间:2016-10-14 14:01:09

标签: python mysql pandas

我试图从三个不同的MySQL表中读取几个列到三个不同的数据帧。

从数据库中读取并不需要很长时间,但实际上将它们放入数据帧中的速度相当慢。

start_time = time.time()
print('Reading data from database...')

from sqlalchemy import create_engine
q_crash = 'SELECT <query string> FROM table1'
q_vehicle = 'SELECT <query string> table2'
q_person = 'SELECT <query string> FROM table3'
engine = create_engine('mysql+pymysql://user:password@host:port/dbasename')

print('Database time: {:.1f}'.format(time.time() - start_time))

crash = pd.read_sql_query(q_crash, engine)
print('Read_sql time for table 1: {:.1f}'.format(time.time() - start_time))
vehicle = pd.read_sql_query(q_vehicle, engine)
print('Read_sql time for table 2: {:.1f}'.format(time.time() - start_time))
person = pd.read_sql_query(q_person, engine)
print('Read_sql time for table 3: {:.1f}'.format(time.time() - start_time))

输出:

Reading data from database...
Database time: 0.0
Read_sql time for table 1: 13.4
Read_sql time for table 2: 30.9
Read_sql time for table 3: 49.4

这是正常的吗?表非常大 - 表3超过601,000行。但是,每当我使用read_csv时,pandas都会毫无障碍地处理更大的数据集。

1 个答案:

答案 0 :(得分:2)

IMO如果你在MySQL数据库中拥有它们,那么向Pandas DFs读取完整的表格没有多大意义 - 为什么不使用SQL来过滤和加入你的数据呢?您真的需要这三个表中的所有行作为Pandas DF吗?

如果你想加入它们,你可以先在MySQL端进行,然后将结果集加载到单个DF ......

类似于:

qry = 'select p.*, v.*, c.* from vehicle v join person p on v.id = p.vehicle_id join crash c on c.id = p.crash_id where <additional where clause>'
df = pd.read_sql(qry, engine)