我对Python和MySQL相当陌生。我正在编写代码,查询60个不同的表,每个表在五分钟内每秒钟包含记录。代码每五分钟执行一次。一些查询可以达到1/2mb的数据,但大多数在50kb范围内。我在一个工作站上运行Windows 7,64位使用MySQL连接器/Python。我正在使用PowerShell窗口测试我的代码,但代码最终将作为计划任务运行。工作站有足够的内存(8 GB)。其他进程正在运行,但根据任务管理器,只有一半的内存被使用。大多数情况下,一切都按预期执行,但有时处理会挂起。我在代码中插入了print语句(我还使用了调试器跟踪)来确定挂起发生的位置。它发生在调用fetchall时。下面是代码的相关部分。所有的CAPS都是(伪)常量。
mncdb = mysql.connector.connect(
option_files=ENV_MCG_MYSQL_OPTION_FILE,
option_groups=ENV_MCG_MYSQL_OPTION_GROUP,
host=ut_get_workstation_hostname(),
database=ENV_MNC_DATABASE_NAME
)
for generic_table_id in DBR_TABLE_INDEX:
site_table_id = DBR_SITE_TABLE_NAMES[site_id][generic_table_id]
db_cursor = mncdb.cursor()
db_command = (
"SELECT *"
+" FROM "
+site_table_id
+" WHERE "
+DBR_DATETIME_FIELD
+" >= '"
+query_start_time+"'"
+" AND "
+DBR_DATETIME_FIELD
+" < '"
+query_end_time+"'"
)
try:
db_cursor.execute(db_command)
print "selected data for table "+site_table_id
try:
table_info = db_cursor.fetchall()
print "extracted data for table "+site_table_id
except:
print "DB exception "+formatExceptionInfo()
print "FETCH failed to return any rows..."
table_info = []
raise
except:
print "uncaught DB error "+formatExceptionInfo()
raise
。..使用数据的其他处理...db_cursor.close ()mncdb.close ()...没有提出任何例外。在一个单独的PowerShell窗口中,我可以访问代码正在处理的数据。对于我的测试,在执行代码之前加载数据库中的所有数据。在测试代码时,没有进程正在更新数据库。挂起可以在第一次执行代码时发生,也可以在执行几个小时后发生。
我的问题是什么可能导致代码挂在fetchall语句?
您可以通过设置读取大小来缓解这个问题:
mncdb = mysql.connector.connect(option_files=ENV_MCG_MYSQL_OPTION_FILE, option_groups=ENV_MCG_MYSQL_OPTION_GROUP,host=ut_get_workstation_hostname(,database=ENV_MNC_DATABASE_NAME, cursorclass = MySQLdb.cursors.SSCursor)
但是在你这样做之前,你还应该使用mysql的借口来准备语句,而不是在构建你的语句时使用字符串连接。
挂起可能涉及MySQL表本身,而不是Python代码。它们包含很多记录吗?桌子很宽吗?它们在datetime_field上被索引了吗?
考虑多种策略:
-
具体选择需要的列而不是星号,调用所有列
-
where子句中使用的
DBR_DATETIME_FIELD
的索引(即隐式连接)。 -
使用打印定时器
print(datetime.datetime.now())
进一步诊断,以查看哪些是瓶颈表。在此过程中,请确保导入datetime
模块。