mysql创建索引
1.创建普通索引
创建一个普通索引时,不需要加任何UNIQUE、FULLTEXT或者SPATIAL参数。
下面创建一个表名为index1的表,在表中的id字段上建立索引。SQL代码如下:
CREATE TABLE index1 (id INT , name VARCHAR(20) , sex BOOLEAN , INDEX ( id) );
运行结果显示创建成功,使用SHOW CREATE TABLE语句查看表的结构。显示如下:
mysql> SHOW CREATE TABLE index1 \G *************************** 1. row *************************** Table: index1 Create Table: CREATE TABLE `index1` ( `id` int(11) DEFAULT NULL, `name` varchar(20) DEFAULT NULL, `sex` tinyint(1) DEFAULT NULL, KEY `index1_id` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec)
2.创建唯一性索引
创建唯一性索引时,需要使用UNIQUE参数进行约束。
下面创建一个表名为index2的表,在表中的id字段上建立名为index2_id的唯一性索引,且以升序的形式排列。SQL代码如下:
CREATE TABLE index2 (id INT UNIQUE , name VARCHAR(20) , UNIQUE INDEX index2_id ( id ASC) );
运行结果显示创建成功,使用SHOW CREATE TABLE语句查看表的结构。显示如下:
mysql> SHOW CREATE TABLE index2 \G *************************** 1. row *************************** Table: index2 Create Table: CREATE TABLE `index2` ( `id` int(11) DEFAULT NULL, `name` varchar(20) DEFAULT NULL, UNIQUE KEY `id` (`id`), UNIQUE KEY `index2_id` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec)
结果可以看到,id字段上已经建立了一个名为index2_id的唯一性索引。这里的id字段可以没有进行唯一性约束,也可以在该字段上成功创建唯一性索引。但是,这样可能达不到提高查询速度的目的。
3.创建全文索引
全文索引只能创建在CHAR、VARCHAR或TEXT类型的字段上。而且,现在只有MyISAM存储引擎支持全文索引。
下面创建一个表名为index3的表,在表中的info字段上建立名为index3_ info的全文索引。SQL代码如下:
CREATE TABLE index3 (id INT , info VARCHAR(20) , FULLTEXT INDEX index3_info ( info ) )ENGINE=MyISAM;
运行结果显示创建成功,使用SHOW CREATE TABLE语句查看表的结构。显示如下:
mysql> SHOW CREATE TABLE index3 \G *************************** 1. row *************************** Table: index3 Create Table: CREATE TABLE `index3` ( `id` int(11) DEFAULT NULL, `info` varchar(20) DEFAULT NULL, FULLTEXT KEY `index3_info` (`info`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 1 row in set (0.00 sec)
结果可以看到,info字段上已经建立了一个名为index3_info的全文索引。如果表的存储引擎不是MyISAM存储引擎,系统会提示"ERROR 1214 (HY000): The used table type doesn‘t support FULLTEXT indexes"。
注意:目前只有MyISAM存储引擎支持全文索引,InnoDB存储引擎还不支持全文索引。因此,在创建全文索引时一定注意表的存储引擎的类型。对于经常需要索引的字符串、文字数据等信息,可以考虑存储到MyISAM存储引擎的表中。
4.创建单列索引
单列索引是在表的单个字段上创建索引。
下面创建一个表名为index4的表,在表中的subject字段上建立名为index4_st的单列索引。SQL代码如下:
CREATE TABLE index4 (id INT , subject VARCHAR(30) , INDEX index4_st ( subject(10) ) );
运行结果显示创建成功,使用SHOW CREATE TABLE语句查看表的结构。显示如下:
mysql> SHOW CREATE TABLE index4 \G *************************** 1. row *************************** Table: index4 Create Table: CREATE TABLE `index4` ( `id` int(11) DEFAULT NULL, `subject` varchar(30) DEFAULT NULL, KEY `index4_st` (`subject`(10)) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec)
结果可以看到,subject字段上已经建立了一个名为index4_st的单列索引。细心的读者可能会发现,subject字段长度为20,而index4_st索引的长度只有10。这样做的目的还是为了提高查询速度。对于字符型的数据,可以不用查询全部信息,而只查询其前面的若干字符信息。
5.创建多列索引
创建多列索引是在表的多个字段上创建一个索引。
下面创建一个表名为index5的表,在表中的name和sex字段上建立名为index5_ns的多列索引。SQL代码如下:
CREATE TABLE index5 (id INT , name VARCHAR(20) , sex CHAR(4) , INDEX index5_ns ( name, sex ) );
运行结果显示创建成功,使用SHOW CREATE TABLE语句查看表的结构。显示如下:
mysql> SHOW CREATE TABLE index5 \G *************************** 1. row *************************** Table: index5 Create Table: CREATE TABLE `index5` ( `id` int(11) DEFAULT NULL, `name` varchar(20) DEFAULT NULL, `sex` char(4) DEFAULT NULL, KEY `index5_ns` (`name`,`sex`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec)