[toc]
索引是一种特殊的数据库结构,可以用来快速查询数据表中的特定记录,也是提高数据库性能的重要方式。
含义与特点
索引是创建在表上的,是对数据库表中一列或多列的值进行排序的一种结构,索引可以提高查询速度。
- 优点
提高检索数据的速度,对于依赖关系的子表和父表之间的联合查询,分组,排序子句时,提高速度。
- 缺点
创建和维护需要耗费额外的时间,索引需要额外的物理空间,每一个索引要占一定的物理空间。表的更改,同样索引也要同样进行更改
虽然查询速度提高,但插入记录的速度会被影响,向有索引的表中插入记录时,会安宅索引进行排序,大量数据的插入尤其明显,解决此办法是删除索引,再进行插入数据,再创建索引。
索引分类
普通索引
不附加任何限制条件,这类索引可以创建在任何数据类型中,其值是否唯一和非空由字段本身的完整性约束条件决定。查询时可以通过索引进行查询。
唯一性索引
使用unique参数可以设置索引为唯一性索引。在创建唯一性索引时,限制该索引的值必须是唯一性的。
全文索引
使用fulltext参数可以设置索引为全文索引。全文索引只能创建在
char,varchar,text
类型的字段上。查询数据较大的字符串类型的字段时,使用全文索引可以提高查询速度。
单例索引
在表中的单个字段上创建索引。单列索引只根据字段进行索引。单列索引可以是上面任意一个索引,只要保证该索引只对应一个字段。
多列索引
多列索引是在表的多个字段上创建一个索引。该索引指向创建时对应的多个字段,可以通过该几个字段进查询,只有查询条件中使用了这些字段中第一个字段时,索引才会被使用。
空间索引
使用spatial参数可以设置索引为空间索引。空间索引只能创建在空间数据类型上,这样可以提高系统获取空间索引的效率。目前只有MyISAM存储引擎支持空间检索。类型包括
geometry point ,lienstring,polygon
等。
索引的设计原则
- 选择唯一性索引
唯一性索引的值是唯一的。可以更快速的通过该索引来确定某条记录。
- 为经常需要排序,分组和联合操作的字段建立索引
经常需要
order by, group by,distinct,union
等操作的字段。
- 为常作为查询条件的字段建立索引
如果某个字段经常用来做查询条件,那么该字段的查询速度会影响整个表的查询速度。
- 限制索引的数目
索引不是越多越好,索引要占用磁盘空间。越多的索引,后期维护和更改也是麻烦事。
- 尽量使用数据量少的索引
如果索引的值很长,那么查询的速度会受到影响。
- 索引使用前缀来索引
如果索引字段的值很长,最好使用值的前缀来索引。
blog,text
字段,全文检索很浪费时间,只检索字段前面若干个字符,这样提高检索速度。
- 删除不再使用或者很少使用的索引
道理很简单,占着茅坑不拉屎。
创建索引
craete table 表名 (属性名 数据类型 [完整性约束条件] [unique|fulltext|spatial] index|key [别名](属性名1, [(长度)][ASC|DESC]))
创建普通索引
create table table1 (id int,
name varchar(20),
index(id)
);
explain
语句可以查询索引是否被使用
explain select * from table1
创建唯一性索引
需要使用unique参数进行约束
create table table2
(id int unique,
name varchar(20),
unique index index_2(id asc)
);
创建全文索引
只能创建在char,varchar,text类型上。只有MyISAM存储引擎支持全文索引
create table table3(
id int ,
info varchar(20),
fulltext index index_3(info)
)engine=MyISAM;
创建单列索引
单列索引是在表的单个字段上创建索引
create table table4(
id int ,
subject varchar(20),
index index_4(subject(10))
);
创建多列索引
create table table5(
id int ,
name varchar(20),
sex char(4),
index index_5(name,sex)
);
创建空间索引
创建空间索引必须使用
spatial
参数来设置,创建空间索引是,表的存储引擎必须是MyISAM
类型,而且索引字段必须有非空约束
create table table6(
id int ,
space geometry not null,
spatial index index_6(space)
)engine=MyISAM;
为已存在的表上创建索引
create [unique|fulltext|spatial] index 索引名 on 表名 (属性名 [(长度)] [asc|desc]);
- unique 表示唯一性索引
- fulltext 表示全文索引
- spatial 表示空间索引
用alter table 语句来创建索引
alter table 表名 add [unique|fulltext|spatial] index 索引名 on 表名 (属性名 [(长度)] [asc|desc]);
删除索引
drop index 索引名 on 表名
网友评论