索引 (索引是对表上一列或者多列进行排序的结构,提高对表中数据的查询速度,不同存储引擎所支持的索引数不同,至少支持16个索引,索引长度256字节,索引有两种存储类型,Btree和hash,一般默认为btree)
索引的优点是对于那些有依赖关系的父表和子表在进行联合查询的时候,会提高查询速度。缺点是创建和维护需要耗费时间。耗费时间的数量随数据量的增加而增加。索引需要占用一定的物理空间。在对数据进行增删改查时还需要动态维护索引,数据维护速度降低。
由于索引会影响插入记录速度。当我们插入大量记录时,可以先删除索引,插入完成之后,再创建索引。
1.索引的分类:
1)普通索引。可以创建在任何数据类型中,查询记录时通过该索引进行查询。
2)唯一索引。设置索引的字段是唯一的,主键就是一种特殊性的唯一索引。
3)全文索引。只能创建在类型为char,vchar,text的字段上。不区分大小写,但索引的列使用二进制排序之后,可以进行大小写的区分。只有MYISAM支持全文检索。
4)单列索引。在表的单个字段上创建索引,单列索引可以是普通,唯一,全文索引的任意一个。查询数据量较大的字符串类型的字段时,可以提高速度。
5)多列索引。在表的多个字段上创建索引,但是只有在查询了这些字段中第一个字段时,索引才会被使用。
6)空间索引。空间索引只能建在空间数据类型上,可以提高系统获取空间数据的效率。空间数据类型有:GEOMETRY,POINT,LINESTRING,POLYGON.目前只有MYISAM支持空间索引,且索引的字段不能为空。
2.索引的设计原则
1)选择唯一性索引。可以通过该索引快速地确定某一条记录。
2)为经常需要排序,分组,联合操作的字段建立索引。如ORDER BY,GROUP BY,DISTINCT,UNION,可以有效避免排序操作。
3)为常作为查询字段的字段建立索引。可以提高整个表的查询速度。
4)限制索引的数目,当索引较多时,会占用一定的磁盘空间,在更新表的时候,也会浪费时间。
5)尽量使用数据量少的索引。如果索引的值很长,查询速度会受到影响。eg:char(100)的索引查询速度比char(10)的查询速度慢多了。
6)尽量使用前缀来索引。当索引的字段的值很长时,如TEXT,BLOG类型的字段,进行全文检索会很浪费时间。只检索字段前面的若干个字符可以提高检索速度。
7)删除不再使用或者很少使用的索引。当表被更新或者使用数据的方式发生变化之后,应该定期找出这些索引,进行删除,减少索引对更新表操作的影响。
总而言之,因根据实际情况来判断,选择最合适的索引方式。
3.创建索引(通过show create table 表名 \G;来查看表的索引)
3.1在创建表的时候创建索引。
**1)创建普通索引。**create table index1(id int,name char,sex boolean,index(id));在index1表上的id字段建立索引。
**2)创建唯一索引。**create table index2(id int unique,name char,unique index index_id2(id,asc));在表的id字段上建立名为index_id2的唯一索引,且以升序排列。
3)创建全文索引。create table index3(id int,name char,fulltext index index_name(name))engine=MYISAM;在index3表上建立name字段的全文索引。这里需要指明存储引擎为MYISAM.
4)创建单列索引。create table index4(id int,name char(20),index index4_name(name(10)));在表index4上建立name字段单列索引,并查询前10个字符,提高查询速度。
5)创建多列索引。create table index5(id int,name char,index index5_sy(id,name));//只有当index5表的第一个字段被查询使用时,该索引才会被触发。
**6)创建空间索引。**create table index6(id int,space GEOMETRY not null,spatial index index6_space(space))engine=MYISAM;在space字段上建立名为index6_space的索引。
3.2对已存在的表创建索引。
**1)创建普通索引。**create index index_sy1 on example0(id);//在example0表上的id字段上创建名为indes_sy的索引
**2)创建唯一索引。**create unique index index_sy2 on example1(id);example1表上id字段可以有unique约束也可以没有。
3)创建全文索引。create fulltext index index_sy3 on example2(name);表的存储引擎必须是MYISAM,表的name字段必须是text,char,vchar字段。
4)创建单列索引。create index index_sy4 on example3(name(10));
5)创建多列索引。create index index_sy5 on example4(id,name);
**6)创建空间索引。**create spatial index index_sy6 on example5(space);space必须是空间类型非空,该表存储引擎必须是MYISAM.
3.3用altertable来创建索引。
1)创建普通索引。alter table example0 add index index_name1(name);
**2)创建唯一索引。**alter table example1 add unique index index_name2(id);
**3)创建全文索引。**alter table example2 add fulltext index index_name3(name);
4)创建单列索引。alter table example3 add index index_name4(id);
5)创建多列索引。alter table example4 add index index_name5(id,name);
**6)创建空间索引。**alter table example5 add spatial index index_name6(space);
3.4删除索引。
drop index 索引名 on 表名 ;