5 .索引

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5 .索引相关的知识,希望对你有一定的参考价值。

5 .索引

为什么要用索引 因为你在查询某个条件 例如:where语句的查询 那么就会很从第一条开始查询 直到查到这条数据 这个效率很低 这个索引就是为此而生!

 

概念:

它好比新华字典的音序表 对数据库表中一列或多列的值进行排序后的一种结构,作用是提高查询效率,提高查询速度。

 

1. 普通索引

是由KEY 或 INDEX 定义的索引,它是mysql中最基本的索引类型,可以创建在任何数据类型中,其值是否唯一和非空由字段本身的约束条件而定。

例如:字段id创建了一个索引,在查找时候就可以根据索引来查找了。

 

 

2.唯一索引

是由UNIQUE定义的索引,这个索引在的字段的值必须是唯一的。

 例如:在id字段建立一个唯一索引 ,那么id字段的值就必须是唯一的

 

 

3.全文索引

是由FULLTEXT定义的索引,他只能创建在CHAR 、VARCHAR或TEXT类型的字段上,而且!只有MyISAM存储引擎支持全文索引。

 

 

4.单列索引

是指在表中单个字段创建索引,它可以是普通索引、唯一索引或者全文索引,只要保证该索引只对应表中的一个字段即可。

 

 

5.多列索引

他指的是在多个字段上创建索引,只要在查询条件中使用了这些字段中的第一个字段时,该索引才能被使用。

 例如:在表中的id、name、grade 字段上创建了一个多列索引,那么只有在查询条件使用了id字段时,该索引才能被使用。

 

 

6.空间索引

空间索引是有SPATIAL定义的索引,它只能创建在空间数据类型的字段上。

MySQl的空间数据类型有4种,分别是CEOMETRY、POINT、LINESTRING和POLYGON。

需要注意的是 创建空间索引的字段必须将其声明   NOT NULL,并且空间索引只能在存储引擎为MyISAM的表中创建。

 

讲了那么多索引的类型和概念 接下来说说怎么创建一个索引

 

 

创建索引

首先你得先创建一个索引才能用索引提高查询的速度。

 

1.创建表的时候创建索引

这种方式是最简单 最方便的了 语法:

CREATE TABLE 表名(

字段 类型,

字段 类型,

[UNIQUE | FULLTEXT | SPATIAL] INDEX | KEY

[别名] ( 字段名1[ (长度) ] ) (ASC | DESC)

);

 

其中:

UNIQUE:可选参数,表示唯一索引。

FULLTEXT:可选参数,表示全文索引。

SPATIAL:可选参数,表示空间索引。

INDEX 或 KEY :用来表示字段的索引,二者选其一即可。

别名:可选参数,用于表示索引的名称。

字段名1:指定索引对应的字段名称。

长度:可选参数,用于表示索引的长度。

ASC 和 DESC : 可选参数,其中ASC 表示升序排列,DESC表示降序排列。

 

例:创建一个普通索引:

CREATE TABLE bihu_1(

id INT,

name VARCHAR(20),

score FLOAT,

INDEX (id)

);

这是直接给ID加了个索引的方式 很简单!

我们可以用 SHOW CREATE TABLE 查看一下他的表结构:

 

 

bihu_1 | CREATE TABLE `bihu_1` (

  `id` int(11) DEFAULT NULL,

  `name` varchar(20) DEFAULT NULL,

  `score` float DEFAULT NULL,

  KEY `id` (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

 

 

这可以看出 创建了一个索引给了id

我们还可以用EXPLAIN语句查看索引是否被使用:

EXPLAIN SELECT * FROM bihu_1 WHERE id = 1\\g

具体我也看不懂 建议百度下…

这语句大概就是可以看出KEY(索引)是谁啊!

 

如果你创建了多列语句 你看下表结构KEY会变为mulit(已存在)

而且 你查询条件如果不是索引第一个字段 你可以看得到他都会NULL(未被使用)的 。

 

WHERE后面接的就是查询条件啊!

 

 

 

2.用CREATE INDEX 语句在已存在的表上创建索引

格式:

CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX 索引名

ON 表名 ( 字段名 [ (长度 )] [ ASC | DESC ]);

 

上面格式中 UNIQUE | FULLTEXT | SPATIAL 都是可选的,分别是 唯一索引,全文索引,空间索引;INDEX用于指定字段为索引。

 

通过有一个表 没有索引,我们为他加上索引:

CREATE TABLE `tb_bihu` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `name` varchar(255) DEFAULT NULL,

  `sex` char(1) DEFAULT NULL,

  `age` char(1) DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

那现在为他创建一个索引:

CREATE INDEX index_id ON tb_bihu (id);

这就是为bihu这个表的字段id创建了最简单的一个索引(单列索引)

 

然之后你可以用show create table bihu \\G查看表的详细结构。

  1. 创建唯一性索引、多列索引、全文索引、空间索引

前提: 表:tb_bihu 字段:id

1): 唯一性索引

CREATE UNIQUE INDEX uniqueindex_id ON tb_bihu(id);

 

2):多列索引(字段: id 和 name)

CREATE INDEX mulitidx ON tb_bihu(id,name);

 

3):全文索引

更换一下存储引擎:

更换为MyISAM存储引擎:

ALTER TABLE tb_bihu ENGINE=MyISAM;

 

把name字段添加全文索引:

CREATE FULLTEXT INDEX full_index ON tb_bihu(id);

 

此处不介绍空间索引 因为 用得少 我也懒得去了解…



  1. 用ALTER TABLE 语句在已存在的表创建索引

在除了用CREATE INDEX 语句外,还可以用ALTER TABLE语句。语句格式如下:

ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名 (字段名 [ (长度) ]  [ ASC | DESC ] );

 

那些可选的就不多说了

其次的话 例子:

 ALTER TABLE tb_bihu ADD INDEX index_id(id);

         

        其他那些创建唯一性索引、多列索引、全文索引、空间索引我不说了,自己按照语句格式来写!!!

 

 

 

 

 

 

 

 

 

  1. 删除索引

索引会占用一定的磁盘空间,因此,为了避免影响数据库性能,应该及时删除不在使用的索引,有两种方法:

 

前提:表tb_bihu的字段id的索引名为 index_id

 

  1. 使用ALTER TABLE 删除索引

语法格式:

ALTER TABLE 表名 DROP INDEX 索引名

例:删除tb_bihu表中id的索引:

ALTER TABLE tb_bihu DROP INDEX index_id;

 

 

 

  1. 用DROP INDEX 删除索引

语法格式:

DROP INDEX 索引名 ON 表名;

 

例:删除tb_bihu表中id的索引:

DROP INDEX index_id ON tb_bihu;

 

 

索引就将那么多了 创建 使用 删除 都说了!

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

MySQL 索引

MySQL 索引

MySQL索引

5.MySQL优化---索引优化专题

44 mysql索引

高性能mysql