数据库索引(算法)
来源:互联网 发布:淘宝天猫代运营公司 编辑:程序博客网 时间:2024/05/21 09:37
概念:
索引是由用户创建的、能够被修改和删除的、实际存储于数据库中的物理存在;创建索引的目的是使用户能够从整体内容直接查找到某个特定部分的内容。
优缺点:
一般来说,索引能够提高查询,但是会增加额外的空间消耗,并且降低删除、插入和修改速度
分类:
1.聚集索引:表数据按照索引的顺序来存储的。
2.非聚集索引:表数据存储顺序与索引顺序无关。
由于聚集索引表的数据需要按照索引的顺序来存储,因此,一张表上只能创建一个聚集索引,非聚集索引则没有这方面的限制
聚集索引对于那些经常要搜索范围值的列或者查询时经常需要对某列进行排序的情况特别有效,但是由于需要保证数据和索引顺序的一致性,会带来对数据增删改效率降低。
常用索引数据结构:
多叉平衡搜索树:B树 / B+树 / B*树
B树
1. d为大于1的一个正整数,称为B-Tree的度。
2. h为一个正整数,称为B-Tree的高度。
3. 每个非叶子节点由n-1个key和n个指针组成,其中d<=n<=2d。
4. 每个叶子节点最少包含一个key和两个指针,最多包含2d-1个key和2d个指针,叶节点的指针均为null 。
5. 所有叶节点具有相同的深度,等于树高h。
6. key和指针互相间隔,节点两端是指针。
7. 一个节点中的key从左到右非递减排列。
8. 所有节点组成树结构。
9. 每个指针要么为null,要么指向另外一个节点。
10. 如果某个指针在节点node最左边且不为null,则其指向节点的所有key小于v(key1),其中v(key1)为node的第一个key的值。
11. 如果某个指针在节点node最右边且不为null,则其指向节点的所有key大于v(keym),其中v(keym)为node的最后一个key的值。
12. 如果某个指针在节点node的左右相邻key分别是keyi和keyi+1且不为null,则其指向节点的所有key小于v(keyi+1)且大于v(keyi)。
图:
B+树及B*树都是B树的变种,和B树相比,B+树:
1.每个节点的指针上限为2d而不是2d+1。
2.内节点不存储data,只存储key;叶子节点不存储指针。
B*树则在B+树的基础上,在内节点上增加了指向兄弟的指针。
数据库面对的常常是海量数据,即使索引也常常放到外存而不是内存。由于多叉树树的高度低,为了尽量减少访问磁盘的次数,采用多叉树而不是二叉树的结构。
Mysql MYISAM及InnoDB引擎采用的是B+树作为索引结构。区别在于,MYISAM采用的非聚集式索引,InnoDB采用的聚集式索引。
Hash索引:
和B树索引相比,Hash索引查询更快,但是其也有一些问题
1. 和Hash索引相比,B+树更适合作为外存索引(Extensible Hash Tables和 Linear Hash Tables可以作为外存索引)
2. 不支持范围查询;在组合键作为索引的情况下,无法使用部分键值做查询;.不能通过索引进行键值排序;
3. 由于Hash值有可能冲突,所以即使取满足某个 Hash 键值的数据的记录条数,也无法从 Hash 索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较。
位图索引:
位图索引是针对那些低基数,并且值不经常改变的列的。
位图索引并不适用于OLTP业务,OLTP一般都是有大量的并发事务来修改同样的数据。bitmap主要就是设计来为数据仓库服务的,即应用于低基数超级大数据量查询服务,而且只用在where clause里包含and ,or,not,或equalityqueries(比如在and和or条件的查询,在把bit转换成rowid以前,就能很快的得到相应的boolean操作)。
扩展阅读可以参看reference中位图相关内容。
索引是由用户创建的、能够被修改和删除的、实际存储于数据库中的物理存在;创建索引的目的是使用户能够从整体内容直接查找到某个特定部分的内容。
优缺点:
一般来说,索引能够提高查询,但是会增加额外的空间消耗,并且降低删除、插入和修改速度
分类:
1.聚集索引:表数据按照索引的顺序来存储的。
2.非聚集索引:表数据存储顺序与索引顺序无关。
由于聚集索引表的数据需要按照索引的顺序来存储,因此,一张表上只能创建一个聚集索引,非聚集索引则没有这方面的限制
聚集索引对于那些经常要搜索范围值的列或者查询时经常需要对某列进行排序的情况特别有效,但是由于需要保证数据和索引顺序的一致性,会带来对数据增删改效率降低。
常用索引数据结构:
多叉平衡搜索树:B树 / B+树 / B*树
B树
1. d为大于1的一个正整数,称为B-Tree的度。
2. h为一个正整数,称为B-Tree的高度。
3. 每个非叶子节点由n-1个key和n个指针组成,其中d<=n<=2d。
4. 每个叶子节点最少包含一个key和两个指针,最多包含2d-1个key和2d个指针,叶节点的指针均为null 。
5. 所有叶节点具有相同的深度,等于树高h。
6. key和指针互相间隔,节点两端是指针。
7. 一个节点中的key从左到右非递减排列。
8. 所有节点组成树结构。
9. 每个指针要么为null,要么指向另外一个节点。
10. 如果某个指针在节点node最左边且不为null,则其指向节点的所有key小于v(key1),其中v(key1)为node的第一个key的值。
11. 如果某个指针在节点node最右边且不为null,则其指向节点的所有key大于v(keym),其中v(keym)为node的最后一个key的值。
12. 如果某个指针在节点node的左右相邻key分别是keyi和keyi+1且不为null,则其指向节点的所有key小于v(keyi+1)且大于v(keyi)。
图:
B+树及B*树都是B树的变种,和B树相比,B+树:
1.每个节点的指针上限为2d而不是2d+1。
2.内节点不存储data,只存储key;叶子节点不存储指针。
B*树则在B+树的基础上,在内节点上增加了指向兄弟的指针。
数据库面对的常常是海量数据,即使索引也常常放到外存而不是内存。由于多叉树树的高度低,为了尽量减少访问磁盘的次数,采用多叉树而不是二叉树的结构。
Mysql MYISAM及InnoDB引擎采用的是B+树作为索引结构。区别在于,MYISAM采用的非聚集式索引,InnoDB采用的聚集式索引。
Hash索引:
和B树索引相比,Hash索引查询更快,但是其也有一些问题
1. 和Hash索引相比,B+树更适合作为外存索引(Extensible Hash Tables和 Linear Hash Tables可以作为外存索引)
2. 不支持范围查询;在组合键作为索引的情况下,无法使用部分键值做查询;.不能通过索引进行键值排序;
3. 由于Hash值有可能冲突,所以即使取满足某个 Hash 键值的数据的记录条数,也无法从 Hash 索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较。
位图索引:
位图索引是针对那些低基数,并且值不经常改变的列的。
位图索引并不适用于OLTP业务,OLTP一般都是有大量的并发事务来修改同样的数据。bitmap主要就是设计来为数据仓库服务的,即应用于低基数超级大数据量查询服务,而且只用在where clause里包含and ,or,not,或equalityqueries(比如在and和or条件的查询,在把bit转换成rowid以前,就能很快的得到相应的boolean操作)。
扩展阅读可以参看reference中位图相关内容。
阅读全文
0 0
- 数据库索引(算法)
- 【数据结构与算法】数据库索引
- 数据库(六)数据库索引
- 数据库索引(一)
- 数据库索引(二)
- 索引 (数据库术语)
- lucene搜索引擎(文件索引、数据库索引)
- lucene搜索引擎(文件索引、数据库索引)
- diy数据库(十)--索引
- mysql数据库(六)索引
- 数据库索引(index)记录
- 【数据库系列(三)】数据库索引
- 数据库 索引&索引类型
- 数据库索引,联合索引
- 关于数据库索引设计的几个常用算法
- [数据库]MySQL索引背后的数据结构及算法原理
- 入门级:从哈希算法到数据库索引
- 数据库索引
- IntelliJ IDEA下的使用git
- Bloom Filter算法及应用
- 英语口语必备900句
- Gossip算法学习
- Shell 传递参数
- 数据库索引(算法)
- 【矩阵快速幂 && 状压dp】hdu-6185 Covering
- metasploit之客户端渗透
- Zookeeper的配置
- 使用Matlab对二值图像进行轮廓提取
- java集合(list,set,map)
- 程序员你为什么这么累?
- 异或运算随笔
- OpenGL ES 2.0 纹理总结