并行执行 MySQL SELECT * 查询

2023-12-06

我有一个多线程应用程序,它定期获取 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中实现它?


MySQL 允许很多连接从单个user或许多users。在该一个连接中,它最多使用一个 CPU 核心,并且一次执行一个 SQL 语句。

一个“事务”可以由多个SQL语句组成,而事务是treated作为原子。考虑经典的银行应用程序:

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

这些语句是串行执行的(在单个连接中);作为一个整体,要么全部成功,要么全部失败(“原子地”)。

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

一个小例外:有一些额外的线程“在幕后”用于执行后台任务,例如预读或延迟写入或刷新内容。但这确实not为用户提供一种在单个连接中“同时做两件事”的方法。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

并行执行 MySQL SELECT * 查询 的相关文章

随机推荐