MySQLdb es extremadamente lento con grandes conjuntos de resultados

Ejecuté la siguiente consulta tanto en phpMyAdmin como en 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 dijo que la consulta tomó 2 ms . Mi código de Python dijo que usando MySQLdb la consulta tomó 848 ms (sin siquiera obtener los resultados).

El código de 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 

PHPMyAdmin establece un límite en todas las consultas para que no devuelva grandes conjuntos de resultados en la interfaz. Entonces, si su consulta normalmente devuelve 1,000,000 de filas y PHPMyAdmin lo reduce a 1,000 (o cualquiera que sea el valor predeterminado), entonces tendría que esperar un tiempo de procesamiento mucho más largo cuando Python capture o incluso consulte el conjunto de resultados completo.

Intente colocar un límite en Python que coincida con el límite de PHPMyAdmin para comparar tiempos.

Si espera que una consulta SQL tenga un gran conjunto de resultados que luego planee iterar sobre registro por registro, es posible que desee considerar el uso del MySQLdb SSCursor en lugar del cursor predeterminado. El cursor predeterminado almacena el conjunto de resultados en el cliente, mientras que el SSCursor almacena el conjunto de resultados en el servidor. A diferencia del cursor predeterminado, el SSCursor no incurrirá en un gran retraso inicial si todo lo que necesita hacer es iterar los registros uno por uno.

Puede encontrar un poco de código de ejemplo sobre cómo usar el SSCursor aquí .

Por ejemplo, intente:

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

(El rest del código puede permanecer igual.)