软件测试-MySQL(八:索引)

索引用于快速找出在某个列中有一定特定值的行。不使用索引必须从第一条记录开始阅读完整的表直到展出相关的行。表越大花费的时间越多,如果查询中的列有一个索引,MySQL能快速到达某个位置去搜寻数据,而不必查看全部的数据文件。

索引是在存储引擎中实现的,因此每种存储引擎都不一定完全相同,并且每种存储引擎的索引都不一定完全相同,并且每种存储引擎不一定会支持所有索引类型。根据存储引擎定义每个表的最大索引数和最大索引长度。所有存储引擎支持每个表最少16个索引,索引总长度最少256个字节。MySQL中索引生物存储类型有两种:BTREE和HASH,具体和表的存储引擎相关;MyISAM和InnoDB存储引擎只支持BTREE索引;MEMORY/HEAP存储引擎可以支持HASH和BTREE索引

一.索引优缺点 

索引的优点:

1)通过创建唯一索引,可以保证数据库表中每一行数据的唯一性

2)可以大大加快数据的查询速度,这也是创建索引的最主要原因

3)在实现数据的参考完整性方面。可以加速和表之间的连接

4)在使用分组和排序子句查询是,也可以显著减少查询中分组和排序的时间

索引的缺点:

1)创建和维护索引要耗费时间,并且随着数据量的增加所好粉的时间也会增加。

2)索引需要占用磁盘空间,除了数据表占用空间外,每一个索引还有占用一定的物理空间,如果有大量的索引,索引未见可能比数据文件更快达到最大文件尺寸

3)当对表中的数据进行增加、删除、修改的时候,索引也需要动态维护,这样就降低了数据维护的速度。

二.索引分类

1.普通索引和唯一索引

普通索引是MySQL中的基本索引类型,允许在定义索引的列中插入重复值和空值

唯一索引,索引列的值必须唯一,但允许有空值。如果是组合作引,则列的值必须唯一,主键索引是一种特殊的索引不允许有空值。

2.单列索引和组合索引

单列索引即一个索引只包含单个列,一个表可以有多个单列索引。

组合索引是指在表的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用。使用组合索引遵循最左前缀集合

3.全文索引

全文索引的类型为FULLTEXT,在定义的列山支持的全完查找,允许在这些索引列中插入重复值和空值。全文索引可以再CHAR、VARCHAR或者text类型的列上创建。MySQL中只有MyISAM存储引擎支持全文索引。

4.空间索引

空间索引是对空间数据类型的字段建立的索引,MySQL中的空间数据类型有4中,分别是:GEOMETRY.PIONT,LINESTRING和POLYGON。MySQL使用SPATIAL关键字进行扩展,使得能够用于创建正规索引类似的语法创建空间索引。创建空间索引的列,必须将其声明为NOT NULL,空间索引只能在存储引擎为MyISAM的表中创建。

三.索引设计原则

索引设计不合理或者缺少索引都会对数据库和应用程序的性能造成障碍。高效的索引对于获得良好的性能非常重要。设计索引是应该考虑以下准则:

1)索引并非越多越好,一个表中如果有大量的索引,不仅占用磁盘空间,而且会影响INSERT,DELETE,UPDATE等语句的性能,因为表中的数据更改的同时,索引也会进行更新和调整

2)避免对经常更新的表进行过度的索引,并且索引中的列尽可能的少。而对于经常查询的字段应该创建索引,但要避免添加不必要的字段

3)数据量小的表尽量不要使用索引,由于数据量小,查询所花费的我还是啊金可能比便利索引的时间和咬断,索引肯不会产生优化效果

4)在条件表达式上经常用到的不同值较多的列上建立索引,在不同值很少的列上不要建立索引。

5)当唯一性是某种数据本身的特征时,指定唯一索引。使用唯一索引需要能确保定义的列的数据的完整性,以提高查询速度。

6)在频繁进行排序或者分组的(进行group by 和order by操作)的列上建立索引。如果待排序的列有多个,可以再这些列上建立组合索引。

四.创建索引

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

CREATE TABLE tablename [col_name data_type] [UNIQUE | FULLTEXT | SPATIAL] [INDEX | KEY] [index_name] (col_name [length]) [ASC | DESC]

1)创建普通索引类型

最基本的索引类型,没有唯一性之类的限制,其作用只是加快数据的访问速度

查看索引是否正在被使用,可以用explain 

 

 2)创建唯一索引

创建唯一索引的原因是减少查询列操作的执行时间,尤其是对笔记庞大的数据表,她与前面的普通索引类似,不同的就是:索引的值必须唯一,但允许有空值,如果是组合索引,则列值必须唯一

 

 3)创建单列索引

单列索是在数据表中的某一个字段上创建的索引,一个表中可以创建多个单列索引。

4)创建组合索引

组合索引是在多个字段上创建一个索引

 

5)创建全文索引

FULLTEXT全文索引可以用于全文搜索。只有MyISAM存储引擎支持FULLTEXT索引,并且只为char、varchar和text列创建索引。索引总是对整个列进行,不支持局部索引

6)创建空间索引

空间索引必须在MyISAM类型的表中创建,且空间类型的字段必须为空。

 

2.在已经存在的表上创建索引

 1)使用ALTER TABLE 语句创建索引

ALTER TABLE table_name ADD [UNIQUE | FULLTEXT | SPATIAL] [INDEX | KEY] [index_name] (col_name[length],...) [ASC | DESC]

查看指定表中创建的索引:show inder from table_name;

添加普通索引: 

 

添加唯一索引:

 2)使用create index 创建索引

create table语句可以再已经存在的表中添加索引,MySQL中create index被映射到一个ALTER TABLE 语句上,基本语法为:

CREATE [UNIQUE | FULLTAXT |SPATIAL] INDEX index_name ON table_name (col_name[length],...) [ASC | DESC]

 

五.删除索引

MySQL中删除索引使用ALTER TABLE 或者DROP INDEX语句,两者可以试想相同的功能,DROP INDEX语句在内部被映射到一个ALTER TABLE 语句中;

1.使用ALTER TABLE 删除索引

ALTER TABLE table_name DROP INDEX index_name;

#可用show index from table_name;查看表创建的索引。

ps:添加AUTO_INCREMENT 约束字段的唯一索引不能被删除 

2)使用DROP INDEX 语句删除索引

DROP INDEX index_name ON table_name;

 

ps:删除表中的列时,如果要删除的列为索引的组成部分,则该列也会从索引中删除。如果组成索引的所有列都被删除,则整个索引删除 

猜你喜欢

转载自blog.csdn.net/sinat_33561108/article/details/89414417