我有一个多线程应用程序,它定期获取 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(使用前将#替换为@)