表的创建和维护

临时表

临时表顾名思义是临时的,生命周期仅限于当前会话,当前会话结束,临时表和表中的数据就会被释放掉

如何创建临时表

mysql> CREATE TEMPLORARY TABLE a(id int);

临时表用的是什么存储引擎?

为什么这里用的是InnoDB?

mysql> show create table a\G
*************************** 1. row ***************************
       Table: a
Create Table: CREATE TEMPORARY TABLE `a` (
  `a` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)

原因在这! 因为这个参数配置了默认临时存储引擎,所以创建临时表时会根据default_tmp_storage_engine参数中配置的engine来创建

mysql> show global variables like '%default_tmp_%';
+----------------------------+--------+
| Variable_name              | Value  |
+----------------------------+--------+
| default_tmp_storage_engine | InnoDB |
+----------------------------+--------+
1 row in set (0.00 sec)

临时表在哪?内存中?文件系统中?

一直以来我都是认为临时表使用在排序中的,而且临时表实在内存中的,但是今天通过学习后才发现,不是这样的,Look!

MySQL有个参数叫做tmpdir,先到这里看下

mysql> show global variables like 'tmpdir';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| tmpdir        | /tmp  |
+---------------+-------+
1 row in set (0.00 sec)

难道这个#sql2993_4_0.frm是a的表定义文件?

[root@Da dbfile1]# ls /tmp/
functions  letsencrypt-auto  minion.pem  #sql2993_4_0.frm

再创建一个临时表试下,果然又出来一个,看来临时表确实没有存在内存中,呃,不过这只是表定义文件,那表中的数据呢?

mysql> CREATE TEMPLORARY TABLE b(id int);
mysql> system ls /tmp
functions  letsencrypt-auto  minion.pem  #sql2993_4_0.frm  #sql2993_4_1.frm

因为表使用的InnoDB存储引擎,看下能够从InnoDB的参数中找到线索呢? 嗯? 看到InnoDB有个innodb_temp_data_file_path参数,会不会跟这个参数有关系呢?

mysql> show global variables like 'innodb_temp_data%';
+----------------------------+-----------------------+
| Variable_name              | Value                 |
+----------------------------+-----------------------+
| innodb_temp_data_file_path | ibtmp1:12M:autoextend |
+----------------------------+-----------------------+

datadir下找到了ibtmp1这个文件

mysql> system ls -ahl /data/dbfile1/ib*
-rw-r-----. 1 mysql mysql 374 Aug  5 07:39 /data/dbfile1/ib_buffer_pool
-rw-r-----. 1 mysql mysql 12M Aug  5 08:01 /data/dbfile1/ibdata1
-rw-r-----. 1 mysql mysql 48M Aug  5 07:51 /data/dbfile1/ib_logfile0
-rw-r-----. 1 mysql mysql 48M Jul  3 04:16 /data/dbfile1/ib_logfile1
-rw-r-----. 1 mysql mysql 12M Aug  5 08:09 /data/dbfile1/ibtmp1

到底是不是存储在这个文件呢? 我们插入一条数据试下,看文件修改时间是否改变

mysql> insert into a select 1;
mysql> system ls -ahl /data/dbfile1/ib*
-rw-r-----. 1 mysql mysql 374 Aug  5 07:39 /data/dbfile1/ib_buffer_pool
-rw-r-----. 1 mysql mysql 12M Aug  5 08:01 /data/dbfile1/ibdata1
-rw-r-----. 1 mysql mysql 48M Aug  5 07:51 /data/dbfile1/ib_logfile0
-rw-r-----. 1 mysql mysql 48M Jul  3 04:16 /data/dbfile1/ib_logfile1
-rw-r-----. 1 mysql mysql 12M Aug  5 08:12 /data/dbfile1/ibtmp1

Σ( ° △ °|||)︴ 改...改变了,唉,传言骗人啊~ 什么放在内存中啊! 全是骗子!

results matching ""

    No results matching ""