在数据库操作中,常常需要完成既定数据的检索。少量数据存放在表中,只需使用基本的SQL语句即可检索得到。但当数据量较大时,受MySQL数据库底层实现原理的限制,缺省的SQL语句,检索效率较低。
例如:当执行”select * from employee where empno= 520000″语句按员工号查询时,MySQL数据库默认的处理方式是从第一条记录开始依次向后遍历,直到找到id为520000的数据。这样,查找的效率随着数据量的增大,而逐步降低。为此,MySQL数据库在建表时允许通过创建索引来加快数据表的查询、排序等相关操作。
5. 多列索引
多列索引是指在表的多个字段上创建索引,只有在查询条件中使用了这些字段中的第一个字段时,该索引才会被使用。如,在student表的id、name和score字段上创建一个多列索引,那么只有查询条件中使用了id字段时,该索引才会被使用。
相较于单列索引,当我们频繁的需要同时检索表中多列时,多列索引的效率会高很多。
6. 空间索引
空间索引是由spatial定义的索引,它只能创建在空间数据类型的字段上。MySQL中的空间数据类型有4种:geometry、point、linestring和polygon。需要注意的是,创建空间索引的字段,必须将其声明为NOT NULL,并且空间索引只能在存储引擎为MyISAM的表中创建。
需要注意的是,虽然索引可以提高数据的查询效率,但索引会占用一定的存储空间。并且创建和维护索引所消耗的时间,是随着数据量的增加而增加的。因此,使用索引时,应综合考虑其优缺点,不能肆意创建。
索引的生成
要想使用索引提高数据表的访问速度,首先要创建一个索引。创建索引的方式大致可分为三种。
创建表指定索引
在MySQL中,创建表时可以直接给表的指定字段指定索引,这种方式需在建表之初就预设了数据即将被频繁检索的场景,其基本语法格式如下所示:
create table 表名 (字段名 数据类型 [完整性约束条件],
字段名 数据类型 [完整性约束条件],
……
字段名 数据类型
[unique|fulltext|spatial] index|key
[别名] (字段名1 [(长度)]) [asc|desc]
);
相关语法解析:
1) unique:可选参数,表示唯一索引。
2) fulltext:可选参数,表示全文索引。
3) spatial:可选参数,表示空间索引
4) index和key:用来表示字段的索引, 二者选一即可。
5) 别名:可选参数,表示穿件的索引名称。
6) 字段名1:指定索引对应字段的名称。
7) 长度:可选参数,用于表示索引的长度。
8) asc和desc:可选参数。asc表升序,desc表降序排列。
MySQL中的6种索引类型,如下:
1) 创建普通索引
【例】在t1表中id字段上创建索引,SQL语句如下:
create table t1 ( id int,
name varchar(20),
score float,
index(id)
);
可使用explain语句查看索引是否被使用,SQL语句如下:
explain select * from t1 where id = 1 ;
4) 创建单列索引
【例】创建一个表名为t4的表,在表中的name字段上建立索引名为single_name的单列索引,SQL语句如下:
create table t4 ( id int not null,
name varchar(20) not null,
score float,
index single_name(name(20))
);
这样,即可在name字段上建立一个名称为single_name的单列索引,并且索引的长度为20。
5) 创建多列索引
【例】创建一个表名为 t5的表,在表中的id和name字段上建立索引名为multi的多列索引,SQL语句如下:
create table t5 ( id int not null,
name varchar(20) not null,
score float,
index nulti(id, name(20))
);
这样,即可在id和name字段上建立一个名为multi的多列索引。
需要注意的是,在多列索引中,只有查询条件中使用了这些字段中的第一个字段时多列索引才会被使用。
为了验证这个说法是否正确,将id字段作为查询条件,通过explain语句查可看索引的使用情况,SQL语句如下:
explain select * from t5 where id = 1;
但是,如果只使用name字段作为查询条件,multi索引不会被使用。
6) 创建空间索引
【例】创建一个表名为t6的表,在空间类型为geometry的字段上创建空间索引,SQL语句如下:
create table t6 ( id int,
space geometry not null,
spatial index sp(space)
) engine=MyISAM;
这样,即可在t6表中的space字段上建立名称为sp的空间索引了。
需要注意的是,创建空间索引时,所在字段的值不能为空值,并且表的存储引擎为MyISAM。
3) 创建单列索引
【例】在book表中的comment字段上建立一个名称为singleidx的单列索引,SQL语句如下所示:
create index singleidx on book (comment);
这样,即可在book表中,为comment字段建立一个名称为singleidx的单列索引。
4) 创建多列索引
【例】在book表中的authors字段和info字段上建立一个名称为mulitidx的多列索引,SQL语句如下所示:
create index mulitidx on book (authors(20), info(20));
这样,即可在book表中,为authors和info字段建立一个名称为mulitidx的多列索引。
5) 创建全文索引
【例】删除表book,重新创建表book, 在book表中的info字段上建立全文索引。首先删除book表。SQL语句如下所示:
drop table book;
然后重新创建表book,SQL语句如下所示:
create table book (
bookid int not null,
bookname varchar(255) not null,
authors varchar(255) not null,
info varchar(255) null,
comment varchar(255) null,
publicyear year not null
)engine=MyISAM;
接下来使用create index 语句在book表的info字段上创建名称为fulltextidx的全文索引,SQL语句如下所示:
create fulltext index fulltextidx on book (info);
这样,即可在book表中,为info字段建立一个名称为fulltextidx的全文索引。
6) 创建空间索引
【例】创建表t7,在表中的g字段上创建名称为spatialidx的空间索引。
首先创建数据表t7,SQL语句如下所示:
create table t7 (g geometry not null) engine=MyISAM;
使用create index 语句在t7表的g字段上,创建名称为spatialidx的空间索引,SQL语句如下所示:
create spatial index spatialidx on t7 (g);
这样,即可在t7表中,为g字段建立一个名称为spatialidx的空间索引。
6) 创建空间索引
【例】创建表test,在表中的space字段上创建名称为spatialidx的空间索引。
首先创建数据表t8,SQL语句如下所示:
create table test (space geometry not null) engine=MyISAM;
使用alter table 语句在t8表的space字段上,创建名称为spatialidx的空间索引,SQL语句如下所示:
alter table testadd spatial index spatialidx (space);
这样,即可在t8表中,为space字段建立一个名称为spatialidx的空间索引。
索引的销毁
索引的维护需要消耗磁盘存储,因此,为了避免影响数据库性能,应该及时删除不再使用的索引。删除索引的方法有两种,如下:
修改表删除索引
使用alter table删除索引的基本语法格式如下所示:
alter table 表名 drop index 索引名
【例】删除student表中名称为tb_idx的全文索引
alter table student drop index tb_idx;
上述SQL语句执行后,可以使用show create table语句查看表结构,来确认索引是否已经成功被删除。
show create table student;
直接删除索引
使用drop index删除索引的基本语法格式如下所示:
drop index 索引名 on 表名;
【例】删除test1表中名称为tb_index的空间索引,SQL语句如下:
drop index tb_index on test1
再次使用show create table 语句查看表结构,发现,test1表中名称为tb_index的索引被成功删除。