广州专业网站设计定制,移动网站开发课程设计,wordpress登录地址无法登录,网站建设套餐128000先来说说临时表的概念。 临时表顾名思义#xff0c;就是临时的#xff0c;用完销毁掉的表。 数据既可以保存在临时的文件系统上#xff0c;也可以保存在固定的磁盘文件系统上。 临时表有下面几种#xff1a;全局临时表这种临时表从数据库实例启动后开始生效#xff0c;在数…先来说说临时表的概念。 临时表顾名思义就是临时的用完销毁掉的表。 数据既可以保存在临时的文件系统上也可以保存在固定的磁盘文件系统上。 临时表有下面几种全局临时表这种临时表从数据库实例启动后开始生效在数据库实例销毁后失效。在MySQL里面这种临时表对应的是内存表即memory引擎。会话级别临时表这种临时表在用户登录系统成功后生效在用户退出时失效。在MySQL里的临时表指的就是以create temporary table 这样的关键词创建的表。事务级别临时表这种临时表在事务开始时生效事务提交或者回滚后失效。 在MySQL里面没有这种临时表必须利用会话级别的临时表间接实现。检索级别临时表这种临时表在SQL语句执行之间产生执行完毕后失效。 在MySQL里面这种临时表不是很固定跟随MySQL默认存储引擎来变化。比如默认存储引擎是MyISAM,临时表的引擎就是MyISAM,并且文件生成形式以及数据运作形式和MyISAM一样只是数据保存在内存里如果默认引擎是INNODB那么临时表的引擎就是INNODB此时它的所有信息都保存在共享表空间ibdata里面。MySQL 5.7对于InnoDB存储引擎的临时表空间做了优化。在MySQL 5.7之前INNODB引擎的临时表都保存在ibdata里面而ibdata的贪婪式磁盘占用导致临时表的创建与删除对其他正常表产生非常大的性能影响。在MySQL5.7中对于临时表做了下面两个重要方面的优化MySQL 5.7 把临时表的数据以及回滚信息(仅限于未压缩表)从共享表空间里面剥离出来形成自己单独的表空间参数为innodb_temp_data_file_path。在MySQL 5.7 中把临时表的相关检索信息保存在系统信息表中information_schema.innodb_temp_table_info. 而MySQL 5.7之前的版本想要查看临时表的系统信息是没有太好的办法。需要注意的一点就是虽然INNODB临时表有自己的表空间但是目前还不能自己定义临时表空间文件的保存路径只能是继承innodb_data_home_dir。此时如果想要拿其他的磁盘比如内存盘来充当临时表空间的保存地址只能用老办法做软链。举个小例子我现在用的OS是 Ubuntu12.X想用tmpfs文件系统充当临时表空间rootytt-master-VirtualBox:/usr/local/mysql/data# ln -s/run/shm/ /usr/local/mysql/data/tmp_space2rootytt-master-VirtualBox:/usr/local/mysql/data#ls -l | grep shmlrwxrwxrwx1 root root 9 Nov 13 10:28tmp_space2 - /run/shm/然后把innodb_temp_data_file_pathtmp_space2/ibtmp2:200M:autoextend添加到my.cnf里的[mysqld]下面一行, 重启MySQL服务后:mysqlselect innodb_temp_data_file_path\G***************************1. row ***************************innodb_temp_data_file_path:tmp_space2/ibtmp2:200M:autoextend1 rowin set (0.00 sec)先写一个批量创建临时表的存储过程DELIMITER$$USEt_girl$$DROPPROCEDURE IF EXISTS sp_create_temporary_table$$CREATEDEFINERrootlocalhost PROCEDURE sp_create_temporary_table(IN f_cnt INT UNSIGNED )BEGINDECLARE i INT UNSIGNED DEFAULT 1;WHILE i f_cntDOSET stmt CONCAT(create temporarytable tmp,i, ( id int, tmp_desc varchar(60)););PREPARE s1 FROM stmt;EXECUTE s1;SET i i 1;END WHILE;DROP PREPARE s1;END$$DELIMITER;现在来创建10张临时表mysqlcall sp_create_temporary_table(10);QueryOK, 0 rows affected (0.07 sec)如果在以前我们只知道创建了10张临时表但是只能凭记忆或者手工记录下来临时表的名字等信息。现在可以直接从数据字典里面检索相关数据。mysql select * frominformation_schema.innodb_temp_table_info;----------------------------------------------------------------------------|TABLE_ID | NAME | N_COLS | SPACE| PER_TABLE_TABLESPACE | IS_COMPRESSED |----------------------------------------------------------------------------| 56 | #sql1705_2_9 | 5 | 36 | FALSE |FALSE || 55 | #sql1705_2_8 | 5 | 36 | FALSE |FALSE || 54 | #sql1705_2_7 | 5 | 36 | FALSE |FALSE || 53 | #sql1705_2_6 | 5 | 36 | FALSE |FALSE || 52 | #sql1705_2_5 | 5 | 36 | FALSE |FALSE || 51 | #sql1705_2_4 | 5 | 36 | FALSE |FALSE || 50 | #sql1705_2_3 | 5 | 36 | FALSE |FALSE || 49 | #sql1705_2_2 | 5 | 36 | FALSE |FALSE || 48 | #sql1705_2_1 | 5 | 36 | FALSE |FALSE || 47 | #sql1705_2_0 | 5 | 36 | FALSE |FALSE |----------------------------------------------------------------------------10rows in set (0.00 sec)功能性我就写到这里大家性能方面如果有兴趣可以找时间去测试。