MySQLdb чрезвычайно медленный с большими наборами результатов

Я выполнил следующий запрос как в phpMyAdmin & MySQLdb (python).

SELECT *, (SELECT CONCAT(`id`, '|', `name`, '|', `image_code`) FROM `model_artist` WHERE `id` = `artist_id`) as artist_data, FIND_IN_SET("metallica", `searchable_words`) as find_0 FROM `model_song` HAVING find_0 

phpMyAdmin сказал, что запрос занял 2 мс . Мой код python сказал, что с использованием MySQLdb запрос занимает 848 мс (даже не получая результаты).

Код python:

 self.db = MySQLdb.connect(host="localhost", user="root", passwd="", db="ibeat") self.cur = self.db.cursor() millis = lambda: time.time() * 1000 start_time = millis() self.cur.execute_cmd("""SELECT *, (SELECT CONCAT(`id`, '|', `name`, '|', `image_code`) FROM `model_artist` WHERE `id` = `artist_id`) as artist_data, FIND_IN_SET("metallica", `searchable_words`) as find_0 FROM `model_song` HAVING find_0""") print millis() - start_time 

2 Solutions collect form web for “MySQLdb чрезвычайно медленный с большими наборами результатов”

PHPMyAdmin ограничивает все запросы, поэтому вы не возвращаете большие результирующие наборы в интерфейсе. Поэтому, если ваш запрос обычно возвращает 1 000 000 строк, а PHPMyAdmin уменьшает это до 1000 (или что бы то ни было по умолчанию), тогда вам придется ожидать намного большего времени обработки, когда Python захватывает или даже запрашивает весь набор результатов.

Попробуйте установить лимит в Python, который соответствует лимиту на PHPMyAdmin, чтобы сравнить время.

Если вы ожидаете, что SQL-запрос будет иметь большой результирующий набор, который вы затем планируете перебирать по записи за записи, тогда вам может понадобиться использовать MySQLdb SSCursor вместо курсора по умолчанию. Курсор по умолчанию сохраняет результирующий набор в клиенте, тогда как SSCursor сохраняет результирующий набор на сервере. В отличие от курсора по умолчанию, SSCursor не будет подвергаться большой начальной задержке, если все, что вам нужно сделать, – это перебор по записям один за другим.

Вы можете найти несколько примеров кода о том, как использовать SSCursor здесь .

Например, попробуйте:

 import MySQLdb.cursors self.db = MySQLdb.connect(host="localhost", user="root", passwd="", db="ibeat", cursorclass = MySQLdb.cursors.SSCursor) 

(Остальная часть кода может оставаться прежней.)

  • Ошибка установки MySQLdb - _mysql.c: 44: 23: error: my_config.h: Нет такого файла или каталога
  • Сервер MySQL ушел - Отключение обработки с помощью обработчика событий проверки не работает
  • Как проверить подключение к базе данных в python?
  • ImportError: нет модуля с именем mysql.base, в проекте django на сервере Ubuntu 11.04
  • Ошибка инструкции UPDATE - MySQLdb / Python
  • python выполняет многие с «при дублировании обновления ключа»?
  • Является ли поведение __enter__ и __exit__ для объектов соединений, указанных в API баз данных Python?
  • Не удается установить библиотеку mysql python на Mac Mavericks
  • Почему диспетчер контекста MySQLdb не закрывает курсор?
  • Выполнить .sql-файл в Python с MySQLdb
  • как добавить новый столбец каждый раз, когда я запускаю программу python
  • Python - лучший язык программирования в мире.