MySQL запросы в python занимают много времени, postgres запросы работают нормально - PullRequest
3 голосов
/ 20 сентября 2011

Я использую профилировщик времени для оптимизации моего скрипта Python. Оказывается, что MySQL запросы занимают много времени в моих скриптах Python. Всего есть только 19 запросов. По данным cProfile, эти 19 запросов mysql занимают более 7,44 с.

Ниже приводится полный сценарий сценария с запросом mysql и соответствующим временем запроса в секундах.

$ python -m cProfile -s time myscript.py 
MYSQL Queries
SELECT column FROM table WHERE foreign_key = 1 AND somecolumn='val1'
0.378623008728
SELECT column FROM table WHERE foreign_key = 1 AND somecolumn='val2'
0.379124879837
...
SELECT column FROM table WHERE foreign_key = 1 AND somecolumn='val19'
0.377450942993

   60122 function calls (59599 primitive calls) in 7.634 CPU seconds

   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
       20    7.440    0.372    7.440    0.372 {method 'query' of '_mysql.connection' objects}
       22    0.025    0.001    0.025    0.001 {method 'execute' of 'psycopg2._psycopg.cursor' objects}
        2    0.008    0.004    0.008    0.004 {method 'commit' of 'psycopg2._psycopg.connection' objects}
     1299    0.007    0.000    0.011    0.000 posixpath.py:59(join)
      982    0.007    0.000    0.007    0.000 {posix.lstat}
      429    0.006    0.000    0.010    0.000 text_file.py:162(readline)
        1    0.006    0.006    0.006    0.006 {psycopg2._psycopg.connect}
        1    0.006    0.006    0.025    0.025 __init__.py:18(<module>)
        2    0.004    0.002    0.007    0.004 connections.py:62(__init__)
      110    0.004    0.000    0.027    0.000 posixpath.py:344(realpath)
       20    0.004    0.000    0.004    0.000 {method 'store_result' of '_mysql.connection' objects}

...

Может кто-нибудь помочь мне выяснить причину?

Спасибо

Ответы [ 2 ]

3 голосов
/ 20 сентября 2011

Возможно, вы забыли создать индекс для (foreign_key, somecolumn), в результате чего MySQL потребуется выполнить полное сканирование таблицы для поиска данных.Это можно увидеть, запустив команду EXPLAIN:

EXPLAIN SELECT column FROM table WHERE foreign_key = 1 AND somecolumn='val1'
0 голосов
/ 20 сентября 2011

Вы пытались включить журнал медленных запросов mysql?

этот файл журнала перечисляет все "медленные" запросы, которые выполняет ядро ​​базы данных. Исходя из этой информации, вы можете попытаться объяснить запрос и посмотреть, не нужно ли вам определять конкретный индекс для таблицы, которую вы используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...