由于个人能力有限,文中可能存在错误,欢迎批评指正。
文章目录
测试
1.查看当前的线程 ID
mysql> select connection_id();
+-----------------+
| connection_id() |
+-----------------+
| 433400 |
+-----------------+
1 row in set (0.00 sec)
当前线程ID为 433400 。
2.创建测试临时表
mysql> create temporary table tmp1 select * from information_schema.tables limit 1;
Query OK, 1 row affected (0.10 sec)
Records: 1 Duplicates: 0 Warnings: 0
3.查看临时表信息
mysql> select * from INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO;
+----------+------------------+--------+--------+----------------------+---------------+
| TABLE_ID | NAME | N_COLS | SPACE | PER_TABLE_TABLESPACE | IS_COMPRESSED |
+----------+------------------+--------+--------+----------------------+---------------+
| 327541 | #sql6456_69cf8_2 | 24 | 327378 | FALSE | FALSE |
+----------+------------------+--------+--------+----------------------+---------------+
我们观察到 NAME 列的值是 #sql6456_69cf8_2,它由3部分构成:
- 第1部分,由“#sql”字符串开始,并加上随机值;
- 第2部分,一串16进制字符;
- 第3部分,单调递增的数值;
对第2部分的字符进行转换,我们把 “69cf8” 从 16 进制转换成 10 进制:
mysql> select conv('69cf8',16,10);
+---------------------+
| conv('69cf8',16,10) |
+---------------------+
| 433400 |
+---------------------+
1 row in set (0.00 sec)
可以看到,正好和当前的线程 ID 是一样的。
根据当前的线程 ID,就能找到该线程 ID 里所创建的临时表,想要释放这些临时表,只需要查询 INNODB_TEMP_TABLE_INFO 表的 NAME 列值所有包含当前线程 ID 的记录,杀掉对应的线程 ID 即可。