mysql索引及临时表的问题.请大侠们帮忙.
[作者]:菩提树下的杨过 [来源]:互联网 [收录时间]:2007-12-9 10:52:45

临时表的建立
CREATE TEMPORARY TABLE tmp_table (
   name    VARCHAR(10) NOT NULL,
   value   INTEGER     NOT NULL
)


索引
当MySQL发现列上有一个索引,它将使用索引而不是执行一个全表扫描。这节省了CPU时间(不必读取所有可能的值)和磁盘I/O,而且它改善了并发性,因为MySQL只锁定表足够长的时间来获得所需的行(基于它在索引中找什么)。当你在表中有大量的数据,最终的改善可能非常明显。 
CREATE TABLE albums ( 
id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, 
title VARCHAR(80)NOT NULL, 

INDEX title_idx (title) 
); 
正如你所见的,语句只是简单地在定义后增加了一个INDEX行告诉MySQL在albums表中的title列上创建名为title_idx的索引。你可以给一个表增加多个索引,就像你可在表中有多个列一样。单个索引也可以有多个列合成。 

要给现有的表加上一个索引而不是重建表,你可以用ALTER TABLE命令: 

ALTER TABLE albums ADD INDEX title_idx (title) 

临时表将在你连接MySQL期间存在。当你断开时,MySQL将自动删除表并释放所用的空间。当然你可以在仍然连接的时候删除表并释放空间。

DROP TABLE tmp_table   

关于索引,当然是你经常基于查询的字段。假如是很多个字段,那么用复合查询:
复合索引(有时称组合索引)是急于多个列的单一索引。MySQL在处理一条查询时每个表只使用一个索引,这意味着假如你有多个经常出现在WHERE子句中的列,你可能要通过创建一个复合索引来加快这些查询。
考虑下列表结构片断:
 CREATE TABLE people (
   last_name       VARCHAR(50) NOT NULL,
   first_name      VARCHAR(50) NOT NULL,
   favorite_color  VARCHAR(10) NOT NULL,
   .
   .
   .
);
假如你经常基于last_name和first_name查询表,你可以从last_name和first_name的复合索引中获益:
INDEX last_first (last_name, first_name) 
由于MySQL构建复合索引的方式,它可以使用last_first索引往返答基于last_name本身或last_name与first_name两者的索引。这是因为假如列涉及复合索引的“最左前缀”的形式,MySQL将只使用一个复合索引。
所以假如一个复合索引有多个列合成:
INDEX big_index (a, b, c, d, e, f, g, h, i) 
MySQL可以用它往返答基于a、或a和b、或a和b和c、或a和b和c和d的查询。但它不能使用big_index处理基于e、或c和f、或g和i的查询,因为这些序列没有一个是从索引的最左边开始的。
复合索引尝被用于加快某些复杂查询,但你需要理解起局限,而且你永远应该进行一些测试,而不是简单地假设这样一个索引将会有帮助。

浅妄薄见,望与斟酌