数据库索引相关

来源:互联网 发布:淘宝怎么设置关键词 编辑:程序博客网 时间:2024/05/15 09:07

数据库相关

1.为什么要建索引

2.索引的一般实现方式

3.该不该建索引


为什么建立索引

如有SQL语句:

SELECT * FROM STUDENT WHERE C1 = 2013222;

如果需要查询对应的记录:
无索引:数据库按照一定的顺序(物理顺序、插入顺序)查找比较表中所有记录,直到找到所有记录为止;

有索引:如果在C1列有对应的索引,则在查找的过程中数据库不需要遍历所有记录,就可以找出所有符合条件的记录;

所以,建立索引主要的作用是优化查询的速度;


索引的一般实现方式

前面说到索引可及减少比较的次数,之所以能这样是索引保存了对应列的有序关系以及对应的物理地址:

简单的比如: 在一个有序的数组中要查找一个数必定要比在一个无序的数组中查找要简单很多;

索引实现的一般算法:

B-Tree和B+Tree(算法略)
目前大部分数据库系统及文件系统都采用B-Tree或其变种B+Tree作为索引结构。具体采用何种算法,需要考虑算法的时间复杂度和数据物理存储方式(略);

由于B-Tree的特性,在B-Tree中按key检索数据的算法非常直观:首先从根节点进行二分查找,如果找到则返回对应节点的data,否则对相应区间的指针指向的节点递归进行查找,直到找到节点或找到null指针,前者查找成功,后者查找失败。:

索引

通过上图,我们可以发现,在有索引的数据表中,可以通过一定的数据结构快速查找定位,再通过所保存的物理地址信息获取到对应的记录数据;

聚集索引:保证物理顺序和逻辑顺序(索引顺序)一致;


该不该建索引

索引并不是越多越好,索引本身需要存储空间,同时索引的维护也需要一定的开销
确定是否有必要建立索引大致需要考虑以下几个问题:

1.建立索引的列的数据类型应该为基本的数据类型

对于BLOB,TEXT等数据量较大或二进制的字段,数据量大,不建议创建索引;

2.建立索引的列是否为经常作为查询条件的列

如果某一列经常作为WHERE语句中的查询条件,则可以考略在对应列上建立索引;

3.建立索引的列的值是否分布均匀(重复字段少)

比如表示性别字段,只会出现男和女两个值,且重复的情况较多,也不建议创建索引;

4.建立索引的列是否为经常变化的字段

对于一些经常变化的字段或者临时表,不建议创建索引,因为值的改变和记录的增删都需要动态维护索引,会增加数据库的开销,减小了数据更新的效率;

总之,是否有必要建立索引需要综合考虑查询效率和数据修改的效率;

参考:

关于数据库索引设计的几个常用算法
MySQL索引背后的数据结构及算法原理


0 0
原创粉丝点击