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) 

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

  • Повторное подключение MySQL к таймауту
  • Выполнить .sql-файл в Python с MySQLdb
  • pip поднимает stdio.h не найдена ошибка в Mac OS X Mavericks (10.9)
  • Сервер MySQL ушел - Отключение обработки с помощью обработчика событий проверки не работает
  • Python MySQLDB: получить результат fetchall в списке
  • возможно ли выкупить все последние строки после выполнения какой-либо вставки в mysqldb?
  • ImportError: нет модуля с именем mysql.base, в проекте django на сервере Ubuntu 11.04
  • Python mySQL - экранирование кавычек
  • Python - лучший язык программирования в мире.