2016-10-14 2 views
0

Я пытаюсь прочитать несколько столбцов из трех разных таблиц MySQL в трех разных фреймах.pandas read_sql необычно медленный

Это не займет много времени, чтобы читать из базы данных, но фактически помещать их в кадр данных довольно медленно.

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:[email protected]: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 строк. Но pandas обрабатывал большие наборы данных без сучка и задоринки всякий раз, когда я использую read_csv.

+0

Вы читаете из таблиц или Просмотры? – agold

+0

Как долго выполняются запросы, когда вы запускаете их из командной строки или из какого-либо инструмента, такого как MySQL workbench (работает на том же компьютере, на котором установлен ваш скрипт Python)? – scomes

+0

Я никогда не создавал представления и ничего не знаю о них, поэтому я предполагаю, что читаю из таблицы. @scomes, когда я запускаю тот же запрос из командной строки, он занимает меньше секунды. – ale19

ответ

2

ИМО не имеет смысла читать полные таблицы в Pandas DFs, если у вас их есть в БД MySQL - почему бы вам не использовать SQL для фильтрации и объединения ваших данных? Вам действительно нужно все строк из этих трех таблиц, как Pandas DFs?

Если вы хотите присоединиться к ним, вы можете сделать это первым на стороне 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) 
Смежные вопросы