【问题标题】:Executing MySQL SELECT * query in parallel并行执行 MySQL SELECT * 查询
【发布时间】:2014-03-04 09:34:33
【问题描述】:

我有一个多线程应用程序,它定期获取 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 multithreading mysql-python


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2015-04-22
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 2014-04-16
    • 2010-09-24
    相关资源
    最近更新 更多