La plupart des connecteurs MySQL basés sur libmysqlclient mettent en mémoire tampon tous les résultats dans la mémoire du client par défaut pour des raisons de performances (en partant du principe que vous ne lirez pas de grands ensembles de résultats).
Lorsque vous devez lire un résultat volumineux dans MySQLdb, vous pouvez utiliser un SSCursor pour éviter de mettre en mémoire tampon des ensembles de résultats volumineux.
http://mysql-python.sourceforge.net/MySQLdb.html#using-and-extending
SSCursor - Un curseur "côté serveur". Comme Cursor mais utilise CursorUseResultMixIn. Utilisez seulement si vous avez affaire à des des ensembles de résultats potentiellement importants.
Cela introduit des complications auxquelles vous devez faire attention. Si vous ne lisez pas tous les résultats du curseur, une deuxième requête soulèvera une ProgrammingError :
>>> import MySQLdb
>>> import MySQLdb.cursors
>>> conn = MySQLdb.connect(read_default_file='~/.my.cnf')
>>> curs = conn.cursor(MySQLdb.cursors.SSCursor)
>>> curs.execute('SELECT * FROM big_table')
18446744073709551615L
>>> curs.fetchone()
(1L, '2c57b425f0de896fcf5b2e2f28c93f66')
>>> curs.execute('SELECT NOW()')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.6/site-packages/MySQLdb/cursors.py", line 173, in execute
self.errorhandler(self, exc, value)
File "/usr/lib64/python2.6/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
raise errorclass, errorvalue
_mysql_exceptions.ProgrammingError: (2014, "Commands out of sync; you can't run this command now")
Cela signifie que vous devez toujours lire tout ce qui se trouve dans le curseur (et potentiellement plusieurs jeux de résultats) avant d'en émettre un autre - MySQLdb ne le fera pas pour vous.