这里有新鲜出炉的 Mysql 教程,程序狗速度看过来!
MySQL 是一个开放源码的小型关联式数据库管理系统,开发者为瑞典 MySQL AB 公司。MySQL 被广泛地应用在 Internet 上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了 MySQL 作为网站数据库。
MySQL 在处理请求的某些场景中, 服务器创建内部临时表。即表以 MEMORY 引擎在内存中处理, 或以 MyISAM 引擎储存在磁盘上处理. 如果表过大, 服务器可能会把内存中的临时表转存在磁盘上。
关于派生表
当主查询中包含派生表,或者当 select 语句中包含 union 字句,或者当 select 语句中包含一个字段的 order by 子句(对另一个字段的 group by 子句)时,MySQL 为了完成查询,则需要自动创建临时表存储临时结果集,这种临时表由 MySQL 自行创建,自行维护,成为自动创建的临时表。对于自动创建的临时表,由于内存临时表的性能更为优越,mysql 总是首先使用内存临时表,而当内存临时表变得太大时,达到某个阈值的时候,内存临时表就转存为外存临时表。也就是说,外存临时表是内存临时表在存储空间上的一种延伸。内存临时表转存为外存临时表的阈值由系统变量 max_heap_table_size 和 tmp_table_size 的较小值决定。
派生表一般在 from 子句中使用。如:
- select * from (select * from table) as t;
关于临时表
当工作在非常大的表上时, 你可能偶尔需要运行很多查询获得一个大量数据的小的子集, 不是对整个表运行这些查询, 而是让 MySQL 每次找出所需的少数记录, 将记录选择到一个临时表可能更快些, 然后在这些表运行查询。
创建临时表很容易, 给正常的 CREATE TABLE 语句加上 TEMPORARY 关键字:
- CREATE TEMPORARY TABLE tmp_table(
- name VARCHAR(10) NOT NULL,
- value INTEGER NOT NULL
- )
临时表将在你连接 MySQL 期间存在。当你断开时, MySQL 将自动删除表并释放所用的空间。当然你可以在仍然连接的时候删除表并释放空间。
- DROP TABLE tmp_table
如果在你创建名为 tmp_table 临时表时名为 tmp_table 的表在数据库中已经存在, 临时表将有必要屏蔽 (隐藏) 非临时表 tmp_table。
如果你声明临时表是一个 HEAP 表, MySQL 也允许你指定在内存中创建它:
- CREATE TEMPORARY TABLE tmp_table(
- name VARCHAR(10) NOT NULL,
- value INTEGER NOT NULL
- ) TYPE = HEAP
因为 HEAP 表存储在内存中, 你对它运行的查询可能比磁盘上的临时表快些。然而, HEAP 表与一般的表有些不同, 且有自身的限制。详见 MySQL 参考手册。
正如前面的建议, 你应该测试临时表看看它们是否真的比对大量数据库运行查询快。如果数据很好地索引, 临时表可能一点不快。
1. 临时表再断开于 mysql 的连接后系统会自动删除临时表中的数据, 但是这只限于用下面语句建立的表:
定义字段:
- CREATE TEMPORARY TABLE tmp_table(
- name VARCHAR(10) NOT NULL,
- value INTEGER NOT NULL
- )
2) 直接将查询结果导入临时表
- CREATE TEMPORARY TABLE tmp_table SELECT * FROM table_name
2. 另外 mysql 也允许你在内存中直接创建临时表, 因为是在内存中所有速度会很快, 语法如下:
- CREATE TEMPORARY TABLE tmp_table(
- name VARCHAR(10) NOT NULL,
- value INTEGER NOT NULL
- ) TYPE = HEAP
3. 从上面的分析可以看出临时表的数据是会被清空的, 你断开了连接就会被自动清空, 但是你程序中不可能每发行一次 sql 就连接一次数据库吧 (如果是这样的话, 那就会出现你担心的问题, 如果不是就没有问题), 因为只有断开数据库连接才会被清空数据, 在一个数据库连接里面发行多次 sql 的话系统是不会自动清空临时表数据的。
来源: http://www.phperz.com/article/17/0813/339440.html