MySQL 性能分析:谁创建的临时表?

由于个人能力有限,文中可能存在错误,欢迎批评指正。

文章目录

测试

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 即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值