并行执行MySQL SELECT *查询

时间:2014-02-07 05:13:06

标签: mysql multithreading mysql-python

我有一个多线程应用程序,定期获取MySQL表的全部内容(使用SELECT * FROM查询) 该应用程序是用python编写的,使用线程模块进行多线程处理,并使用mysql-python(mysqldb)作为MySQL驱动程序(使用mysqlalchemy作为包装器产生类似的结果)。 我在我的MySQL数据库中使用InnoDB引擎。

我编写了一个简单的测试来并行检查SELECT *查询的性能,并发现所有这些查询都是按顺序执行的。

我明确地将ISOLATION LEVEL设置为READ UNCOMMITTED,尽管它似乎对性能没有帮助。

进行数据库调用的代码片段如下:


@performance.profile()
def test_select_all_raw_sql(conn_pool, queue):
    ''' 
    conn_pool - connection pool to get mysql connection from
    queue - task queue
    '''
    query = '''SELECT * FROM table'''
    try:
        conn = conn_pool.connect()
        cursor = conn.cursor()
        cursor.execute("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED")
        # execute until the queue is empty (Queue.Empty is thrown)
        while True:
            id = queue.get_nowait()
            cursor.execute(query)
            result = cursor.fetchall()
    except Queue.Empty:
            pass
    finally:
        cursor.execute("SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ")
        conn.close()

我是否正确期望此查询并行执行? 如果是,我如何在python中实现它?

1 个答案:

答案 0 :(得分:0)

MySQL允许来自单个用户或多个用户的许多连接。在该连接中,它最多使用一个CPU内核,并且一次执行一个SQL语句。

一个“事务”可以由多个SQL语句组成,而该事务被原子地处理。考虑经典的银行应用程序:

BEGIN;
UPDATE ...  -- decrement from one user's bank balance.
UPDATE ...  -- increment another user's balance.
COMMIT;

那些语句是串行执行的(在单个连接中);它们要么全部成功,要么全部失败(“原子上”)。

如果您需要“并行”执行操作,请具有一个或多个客户端,这些客户端可以运行多个线程(或进程),并且每个线程都可以独立地与MySQL建立连接。

一个小例外:在后台执行一些额外的线程来执行后台任务,例如预读或延迟写入或刷新。但这 not 并没有给用户提供一种在单个连接中“一次完成两件事”的方法。

我在这里所说的内容适用于MySQL / MariaDB的所有版本以及访问它们的所有客户端软件包。