索引Index - zLulus/My_Note GitHub Wiki
优缺点
索引是对数据库表中一列或多列的值进行排序的一种结构
为了提高查询的效率
索引一般建立在需要经常查询的地方
优点
创建索引可以大大提高系统的性能
第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
第二,可以大大加快 数据的检索速度,这也是创建索引的最主要的原因。
第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
第四,在使用分组和排序 子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
缺点
第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
第二,索引需要占物理空间
,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。(空间换时间)
第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
索引分类1
普通索引
最基本的索引,没有任何限制
唯一索引
唯一索引是不允许其中任何两行具有相同索引值的索引。
主键索引是特殊的唯一索引,不允许有空值。
数据库表经常有一列或列组合,其值唯一标识表中的每一行,该列称为表的主键。
在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。
全文索引
组合索引
最左匹配原则
两个字段(name,age)建立联合索引,如果where age=12这样的话,是没有利用到索引的
查询条件where name=‘xxx’ and age=xx 这时的话,就利用到索引了
再来思考下,where age=xx and name=’xxx‘ 这个sql会利用索引吗->优化器会进行优化,会利用
候选索引
与主索引一样要求字段值的唯一性,并决定了处理记录的顺序
可以为每个表建立多个候选索引
参考:http://blog.csdn.net/desow/article/details/4683241
索引分类2
sql server设置
聚集索引
在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。
eg.字典-字母表,查到索引即查到字(数据)
如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。
非聚集索引
存储指向真正数据行的指针
eg.字典-偏旁部首表,查到索引,再根据索引查到字(数据)
索引方法
MySQL可以选择,sql server不能
B+索引
数据有序,范围查询
hash索引
hash索引,等值查询效率高,不能排序,不能进行范围查询
使用哈希函数将键映射成索引,键值对索引
创建索引
直接创建索引,例如使用CREATE INDEX语句或者使用创建索引向导
间接创建索引,例如在表中定义主键约束或者唯一性键约束时,同时也创建了索引
直接创建索引
1、唯一的索引 (Unique Index)
CREATE UNIQUE INDEX 索引名称
ON 表名称 (列名称)
2、简单的索引
CREATE INDEX 索引名称
ON 表名称 (列名称)
eg.create index haha on Course(CourseCode,Name)
以降序索引某个列中的值
CREATE INDEX PersonIndex
ON Person (LastName DESC)
检查索引是否存在
以SQL Server为例,检查索引是否存在,如果不存在,则创建索引
IF NOT EXISTS (SELECT 1
FROM sys.indexes I
INNER JOIN sys.tables T ON I.object_id = T.object_id
INNER JOIN sys.schemas S ON S.schema_id = T.schema_id
WHERE I.Name = 'Index_Name' -- Index name
AND T.Name = 'Table_Name' -- Table name
AND S.Name = 'Schema_Name') --Schema Name
CREATE INDEX Your_New_Index ON Schema_Name.Table_Name(Column)
GO
其他
对一个投入使用的在线事务处理表格有过多索引需要有什么样的性能考虑?
你正在寻找进行与数据操控有关的应聘人员。
对一个表格的索引越多,数据库引擎用来更新、插入或者删除数据所需要的时间就越多,因为在数据操控发生的时候索引也必须要维护。
要求的存储空间越多