gpt4 book ai didi

mysql - 并行执行 MySQL SELECT * 查询

转载 作者:行者123 更新时间:2023-12-03 13:12:44 24 4
gpt4 key购买 nike

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

我编写了一个简单的测试来检查 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 允许来自单个用户 或多个用户 的多个连接。在那个连接中,它最多使用一个 CPU 内核并一次执行一个 SQL 语句。

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

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

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

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

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

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

关于mysql - 并行执行 MySQL SELECT * 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21619856/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com