内存表:
1、通过My.cnf中的max_heap_table_size指定,支持动态指定
2、表定义是存放在磁盘上的,扩展名为.frm,重启不会丢失,数据是存放在内存中的,所以重启会丢失数据
3、不支持BLOB或TEXT列
4、内存表初始化,可以使用--init-file来初始化,避免重启mysql后数据被清空。比如--init-file="/data/mysql/init.sql", init.sql格式为:
use db_test;
select *** into m_table;
5、在数据库复制时,如果主机当掉,则会在下次对主库访问的临时表访问时对binLog自动加入delete from [内存表],将slave的数据也删除掉,以保证两边的数据一致性。
6、内存表不支持事务。
7、内存表是表锁,当修改频繁时,性能可能会下降。
8、对于重启造成的数据丢失,有以下的解决办法:
1、在任何查询之前,执行一次简单的查询,判断heap表是否存在数据,如果不存在,则把数据重新写入,或者DROP表重新复制某张表。这需要多做一次查询。不过可以写成include文件,在需要用该heap表的页面随时调用,比较方便。
2、对于需要该heap表的页面,在该页面第一次且仅在第一次查询该表时,对数据集结果进行判断,如果结果为空,则需要重新写入数据。这样可以节省一次查询。
3、更好的办法是在mysql每次重新启动时自动写入数据到heap,但是需要配置服务器,过程比较复杂,通用性受到限制。
临时表:
1、临时表最大所需内存需要通过tmp_table_size设定,实际最大内存由max_heap_table_size和tmp_table_size的最小值决定,tmp_table_size对每个线程分配
2、如果内存临时表超出了限制,MySQL就会自动地把它转化为基于磁盘的MyISAM表,存储在指定的tmpdir目录下
3、Created_tmp_disk_tables 和 Created_tmp_tables 可以看出临时表和磁盘创建的数量,一般Created_tmp_disk_tables/Created_tmp_tables<5%
4、create temporary table tmp1(id int not null); 可以创建临时表