MySQL临时表用法

MySQL目前还不支持动态游标(可能这个名词用在这里不准确),但很多时候我们需要这样的一个功能(http://bugs.mysql.com/bug.php?id=17153)
比如在存储过程中根据传入的参数动态查询出数据,然后遍历数据,这个时候我们当然想动态的构建出这个游标出来

人民大众就开始想尽办法来实现类似的功能,比如下面的创建一个临时表来完成

mysql> CREATE TEMPORARY TABLE tmp_data (uid int(11) NOT NULL) ENGINE=MEMORY DEFAULT CHARSET=utf8;

注意这里为了提高速度用的是MEMORY引擎,当然它有一些限制行的东西,比如表的大小限制,某些类型的字段不能保存
可以根据自己的情况来抉择
更多信息可以参考http://dev.mysql.com/doc/refman/5.1/en/memory-storage-engine.html
还有一些参考意义的测评也可以借鉴,比如http://www.mysqlperformanceblog.com/2007/08/16/how-much-overhead-is-caused-by-on-disk-temporary-tables/

这里还给它增加了个索引
mysql> ALTER TABLE tmp_data ADD INDEX idx_uid (uid);
mysql> SHOW INDEX FROM tmp_data;

当然用完之后记得清理表,简单的方法就是
mysql> DROP TEMPORARY TABLE tmp_data;

临时表在不同连接之间是不可见的,但是在多线程的环境中,这个还是应该值得注意

还有更多的问题值得研究,比如create和drop临时表不会产生事务提交
但直接DROP TABLE tmp_data;也会删除临时表,但是会提交前面打开事务

临时表和正式表重名机制等等

另外,其实在MySQL内部它也大量使用了临时表,当然对程序员来说都是透明的,你不用关心它什么时候用,数据是放在内存还是放在硬盘上的
想看的话可以通过explain查看

Leave a Reply

Your email address will not be published. Required fields are marked *