【发布时间】: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