您的位置:首页 > 数据库

数据库实用索引优化

2016-04-06 22:20 218 查看

简单介绍:

数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。数据库索引好比是一本书前面的目录,能加快数据库的查询速度。索引分为聚簇索引(聚集索引)和非聚簇索引(非聚集索引)两种,聚簇索引 是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。

具体聚集索引和非聚集索引可参考:

聚集索引和非聚集索引(整理)

提示:尽管唯一索引有助于定位信息,但为获得最佳性能结果,建议改用主键或唯一约束。考虑已在表上创建的索引数量。最好避免在单个表上有很多索引

唯一索引: 唯一索引是不允许其中任何两行具有相同索引值的索引。

索引优缺:

创建索引可以大大提高系统的性能主要有:

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

可以大大加快数据的检索速度,这也是创建索引的最主要的原因。

可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。

通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

但是增加索引也有许多不利的方面:

创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加

索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。

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

索引的实现方式:

B+树:B≠Binary,B=Balance

用这个树的目的和红黑树差不多,也是为了尽量保持树的平衡,当然红黑树是二叉树,但B+树就不是二叉树了,节点下面可以有多个子节点,数据库开发商会设置子节点数的一个最大值,这个值不会太小,所以B+树一般来说比较矮胖,而红黑树就比较瘦高了。

散列索引:一般是系统自动优化使用的。

不过很少有单独使用散列索引的,反而是散列文件组织用的比较多。

散列文件组织就是根据一个键通过散列计算把对应的记录都放到同一个槽中,这样的话相同的键值对应的记录就一定是放在同一个文件里了,也就减少了文件读取的次数,提高了

位图索引

位图索引是一种针对多个字段的简单查询设计一种特殊的索引,适用范围比较小,只适用于字段值固定并且值的种类很少的情况,比如性别,只能有男和女,或者级别,状态等等,并且只有在同时对多个这样的字段查询时才能体现出位图的优势。

B+树最常用,性能也不差,用于范围查询和单值查询都可以。特别是范围查询,非得用B+树这种顺序的才可以了。

索引的使用场景:

查询时:

-where,条件中包含索引字段
-order by,排序条件中包含索引字段
-on,在join的on子句中包含索引字段
-select a, b, 索引“覆盖”要查询的结果字段


更新时:

-where ,条件中包含索引字段


插入时

-更新、检查索引数据结构(主键约束、唯一约束)


MySQL中外键蕴含索引,即不能单独删除外键对应的索引

PostgreSQL,Oracle有外键不代表有索引

索引代表了数据全集合如:全集是(1,A) , (2,A) , (3,C) , (4,B)则索引是这么个有序列表:

A-> (1,A), (2,A)
B-> (4,B)
C-> (3,C)


为哪些字段添加索引

添加索引的地方(按照优先级排序)
1.on
2.where
3.group by
4.order by


数据值的区分度:

设数据全集的个数是N
设某列的可能值的个数是M
该列的值的区分度为M/N


区分度越大,索引的效率越高。如:确定一个人,通过身份证号和通过生日或姓名的难度是不同的。优先为高区分度列添加索引

高区分度的典型场景:

主键的区分度= 1
唯一索引字段的区分度= 1 – (null值记录数/总记录数)
非空唯一索引字段的区分度  = 1
外键的区分度≈主表记录数/从表记录数
时间值的区分度≈1/单位时间内的平均记录数


低区分度的典型场景:

枚举值的区分度=枚举个数/记录数
如果枚举值够多,也可考虑,因为,相比全表扫描,走索引可以提高约N倍的效率(N=枚举值个数)
布尔值的区分度= 2/记录数
所有一般情况下对布尔值的列加索引是极其低效的


只有在特定业务场景下,总是要快速选择出某些出现数量很少的值才考虑添加索引, 如:假定被禁用的某资源相比总记录数是非常少的,但是业务上又常常需要筛选出这些资源时。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据库 索引