[openstack-dev] [all] Replace mysql-python with mysqlclient

Mike Bayer mbayer at redhat.com
Thu Apr 30 17:48:56 UTC 2015

On 4/30/15 11:00 AM, Victor Stinner wrote:
> Hi,
> I propose to replace mysql-python with mysqlclient in OpenStack applications to get Python 3 support, bug fixes and some new features (support MariaDB's libmysqlclient.so, support microsecond in TIME column).

It is not feasible to use MySQLclient in Python 2 because it uses the 
same module name as Python-MySQL, and would wreak havoc with distro 
packaging and many other things.   It is also imprudent to switch 
production openstack applications to a driver that is new and untested 
(even though it is a port), nor is it necessary.   There should be no 
reason Openstack applications are hardcoded to one database driver.    
The approach should be simply that in Python 3, the mysqlclient library 
is installed instead of mysql-python. MySQLclient installs under the 
same name, so in this case there isn't even any change to the SQLAlchemy 
URL required.

> The MySQL database is popular, but the Python driver mysql-python doesn't look to be maintained anymore. The latest commit was done in january 2014, before the release of MySQL-python 1.2.5:
>     https://github.com/farcepest/MySQLdb1/commits/master
> One major issue is that mysql-python doesn't support Python 3. It blocks porting most OpenStack applications to Python 3. There are now 32 open issues and 25 pending pull requests. I also sent an email to Andy Dustman (aka farcepest) last week, but I didn't get any reply yet.
> There is an open discussion to replace mysql-python with PyMySQL, but PyMySQL has worse performance:
>     https://wiki.openstack.org/wiki/PyMySQL_evaluation
PyMySQL is monkeypatchable, so as long as we are using eventlet, it is 
*insane* that we are using MySQL-Python at all, because it is actively 
making openstack applications perform much much more poorly than if we 
just removed eventlet.      So as long as eventlet is running, PyMySQL 
wins the performance argument hands down (as described at the link 
which is in the third paragraph of that wiki page).  And it's Py3k 

The performance results in that wiki page are also out of date. Naoki 
INADA has merged several performance improvements since then.

My ultimate setup would still use mysql-python Py2K / MySQLclient Py3K, 
and Openstack applications would again use traditional threads for 
database APIs.   But that is two changes.

so to sum up:

1. keep Mysql-python on Py2K, use mysqlclient on py3k, changing the 
implementation of the "MySQLdb" module on Py2K, server-wide, would be 
very disruptive

2. if we actually care about performance, we either A. dump eventlet or 
B. use pymysql.    All other performance arguments are moot right now as 
we are in the basement.

More information about the OpenStack-dev mailing list