mysql创建索引

Posted 程序员小宇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)
技术图片

 

以上是关于mysql创建索引的主要内容,如果未能解决你的问题,请参考以下文章

mysql创建索引

mysql创建索引

MySQL最多可建立多少索引和索引的限制

mysql有几种索引类型?使用索引时都有那些地方要注意

MySQL 实体框架:无法创建索引

mysql有几种索引类型?使用索引时都有那些地方要注意?sql优化原则