机制解密MySQL临时表的删除机制(mysql临时表删除)

MySQL临时表是一种只存在于当前会话期间的表,有时也被称为内存表,由于典型用户在处理过程中会产生大量的临时表,因此临时表有一定的删除机制来限制在进程内存中存在的临时表数量。

MySQL拥有一个用于扫描并移除未使用的临时表的内部线程(Thread_specific_temp_table_limits线程),负责清理没有用到的临时表。这个线程会每隔一段时间(由变量tmp_table_cleanup_threshold_per_thread控制)检查服务器内存中的临时表的数量,如果多于一定的数量,则从系统内存中清理一部分表。

MySQL提供了允许用户更多灵活性来调整临时表缓存机制的变量,比如tmp_table_cleanup_threshold_per_thread变量用于控制每个连接处理程序中打开可用表的绝对上限,max_tmp_tables变量控制每个连接处理程序中打开Table(无论是否被使用)的总数量的上限,还有max_heap_table_size变量用于限制MySQL内存中的单个表的大小,除此之外,还有tmp_table_size变量用于控制分配给所有表的总容量上限等。

MySQL通过监控这些变量,并在变量超过预设范围(或最大值)时,运行Thread_specific_temp_table_limits线程来清理临时表,以保证MySQL性能不被内存中过多消耗存在未使用临时表而过多占用,使系统更加稳定。

以上是对MySQL临时表删除机制的一般解释,关于实现原理,可以参考下面一段代码:

//扫描并清除缓存中的闲置临时表
void cleanup_tmp_tables()
{
int deleted_tables = 0;
//扫描需要清理的临时表
for (TmpTables *tmp_tables : tmp_tables_list) {
//枚举每个表
for (Table *table : tmp_tables->tables) {
//如果表为闲置状态
if(table->usage_count == 0)
{
//从连接处理程序中移除
tmp_tables->remove_table(table);
deleted_tables += 1;
}
}
}
//移除表之后,更新正在使用的临时表的总数
tmp_table_cleanup_threshold_per_thread -= deleted_tables;
}

从上面的代码可以看出,MySQL内部线程Thread_specific_temp_table_limits是如何清理未使用临时表的,它会枚举每个连接处理程序中的Table,如果发现某张表未被当前会话使用过,则将其从连接处理程序中移除,并更新正在使用的临时表的总数,以保证MySQL在内存中的占用不超过预定的范围。


数据运维技术 » 机制解密MySQL临时表的删除机制(mysql临时表删除)