什么是索引?
宏观来说,索引是一种检索工具,目录也是一种检索工具,但是两者是有区是别的
官方概念是说:
索引与目录的根本区别就在于著录的对象不同,目录所著录的是一个
完整的出版单位,如一种图书、一种期刊等,而索引所著录的则是完整的出版物的
某一部分、某一观点、某一知识单元、一种期刊等;
简单来说,
目录能定位到一本书,而索引能定位到这本书的一段内容或是更细的一行文字。
在关系型数据库中,索引是一个特有术语:
在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,
它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。
简单来说,
有了索引,可以通过索引找到指定列的指定记录
索引的四大作用
①更快读取数据(至于为什么能加快速度,可参考博文:(转)深入浅出数据库索引原理 | (转)MySql数据库索引原理);
②保证数据记录的唯一性(唯一索引确保的);
③实现表与表之间的参照完整性;
### 这里穿插一些关于数据库完整性的概念(参考百度文库文档:(转)文库文档):
1)参照完整性
作用:保证数据之间的完整性;
实现:在数据库设计器中设计表之间的联系时,要在父表中建立主索引或候选索引,在子表中建立普通索引,
然后通过父表的主索引(候选索引)和子表的普通索引建立起两个表之间的联系。
2)实体完整性
作用:保证表中记录唯一的特性;
实现:主关键字建立主索引/唯一索引;
3)域完整性
作用:保证表中字段的正确性;
实现:通过限定字段的类型、字段(表)有效性规则、默认值来实现;
④在使用ORDER by、group by子句进行数据检索时,利用索引可以减少排序和分组的时间;
索引的优缺点
优点:
1、大大加快数据的检索速度;
2、创建唯一性的索引,保证数据库表中每一行数据的唯一性;
3、加速表与表之间的连接;
4、在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间;
缺点:
1、索引需要占用物理空间;
2、当对表中的数据进行增加、删除和修改的时候,索引也要有动态的维护,降低了数据的维护速度;
索引分类
普通索引
最基本的索引类型,没有唯一性之类的限制。
//创建索引
create index my_index on my_table(username(15));
//修改索引
alter table my_table add index my_index(my_column);
//创建表时创建索引
create table my_table(
id int not null,
username varchar(15) not null,
index my_index (username(15))
);
//删除索引
drop index my_index;
唯一索引(关键词:unique)
唯一索引是不允许其中任何两行具有相同索引值的索引(与主键索引的区别是唯一索可允许为空而主键索引不能)。
//创建唯一索引
create unique my_index on my_table(username(15));
//修改唯一索引
alter table my_table add unique my_index(my_column);
//创建表时创建唯一索引
create table my_table(
id int not null,
username varchar(15) not null,
unique my_index (username(15))
);
//删除索引
drop index my_index;
//显示索引信息
show index from my_table;
主键索引
在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型(主键索引=唯一索引+非空);
候选索引
与主索引一样要求字段值的唯一性,并决定了处理记录的顺序。
聚集索引(关键词:clustered)
也称为聚簇索引,在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引;例如时间、年份、这类可以排序的列就可用聚集索引;
非聚集索引(关键词:nonclustered)
也叫非簇索引,在非聚集索引中,数据库表中记录的物理顺序与索引顺序可以不相同。一个表中只能有一个聚集索引,但表中的每一列都可以有自己的非聚集索引;
什么地方需要建索引(参考原文:(转)Mysql哪些地方需要建立索引)
1、表的主键、外键必须有索引;
2、数据量超过300的表应该有索引;
3、经常与其他表进行连接的表,在连接字段上应该建立索引;
4、经常出现在where子句中的字段,特别是大表的字段,应该建立索引;
5、索引应该建立在选择性高的字段上;
6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替;
a、正确选择复合索引中的主列字段,一般是选择性较好的字段;
b、复合索引的几个字段是否经常以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;
c、如果复合索引中包含的字段经常单独出现在where子句中,则分解为多个单字段索引;
d、如果复合索引中包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;
e、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
8、频繁进行数据操作的表,不要建立太多的索引;
9、删除无用的索引,避免对执行计划造成负面影响;
索引优化
暂无,详解可参考:(转)MySQL 索引及优化实战