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查看表的详细结构。
- 创建唯一性索引、多列索引、全文索引、空间索引
前提: 表: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);
此处不介绍空间索引 因为 用得少 我也懒得去了解…
- 用ALTER TABLE 语句在已存在的表创建索引
在除了用CREATE INDEX 语句外,还可以用ALTER TABLE语句。语句格式如下:
ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名 (字段名 [ (长度) ] [ ASC | DESC ] );
那些可选的就不多说了
其次的话 例子:
ALTER TABLE tb_bihu ADD INDEX index_id(id);
其他那些创建唯一性索引、多列索引、全文索引、空间索引我不说了,自己按照语句格式来写!!!
- 删除索引
索引会占用一定的磁盘空间,因此,为了避免影响数据库性能,应该及时删除不在使用的索引,有两种方法:
前提:表tb_bihu的字段id的索引名为 index_id
- 使用ALTER TABLE 删除索引
语法格式:
ALTER TABLE 表名 DROP INDEX 索引名
例:删除tb_bihu表中id的索引:
ALTER TABLE tb_bihu DROP INDEX index_id;
- 用DROP INDEX 删除索引
语法格式:
DROP INDEX 索引名 ON 表名;
例:删除tb_bihu表中id的索引:
DROP INDEX index_id ON tb_bihu;
索引就将那么多了 创建 使用 删除 都说了!
以上是关于5 .索引的主要内容,如果未能解决你的问题,请参考以下文章