位图索引和B tree索引的区别

本文深入探讨了SQL中的索引技术,包括B*Tree和Bitmap索引的原理、特点及使用场景,并阐述了导致索引失效的情况及解决策略。
(1)、与索引相关视图
查询DBA_INDEXES视图可得到表中所有索引的列表;访问USER_IND_COLUMNS视图可得到一个给定表中被索引的特定列。
(2)、组合索引概念
当某个索引包含有多个已索引的列时,称这个索引为组合(concatented)索引。
注意:只有在使用到索引的前导索引时才可以使用组合索引
(3)、B*Tree索引
B*Tree索引是最常见的索引结构,默认建立的索引就是这种类型的索引。B*Tree索引在检索高基数数据列(高基数数据列是指该列有很多不同的值)时提供了最好的性能。
DML语句:
Create index indexname on
tablename(columnname[columnname...])
B-tree特性:
适合与大量的增、删、改(OLTP);
不能用包含OR操作符的查询;
适合高基数的列(唯一值多);
典型的树状结构;
每个结点都是数据块;
大多都是物理上一层、两层或三层不定,逻辑上三层;
叶子块数据是排序的,从左向右递增;
在分支块和根块中放的是索引的范围。
(4)、Bitmap索引
位图索引主要用于决策支持系统或静态数据,不支持行级锁定。位图索引最好用于低cardinality列(即列的唯一值除以行数为一个很小的值,接近零)。
DML语句:
Create BITMAP index indexname on
tablename(columnname[columnname...])
Bitmap特性:
适合与决策支持系统;
做UPDATE代价非常高;
非常适合OR操作符的查询;
基数比较少的时候才能建位图索引。
(5)、B*tree和Bitmap的不同
在一颗
B*
树中,通常索引条目和行之间存在一种一对一的关系:一个索引条目就指向一行;而对于位图索引,一个索引条目则使用一个位图同时指向多行。
位图索引适用于高度重复而且通常只读的数据(高度重复是指相对于表中的总行数,数据只有很少的几个不同值)。B*tree索引的话通常在访问小数据量的情况下比较适用,比如你访问不超过表中数据的5%,适用于一般的情况;bitmap的话在数据仓库中使用较多,用于低基数列,比如性别之类重复值很多的字段,基数越小越好。
(6)、导致索引失效的情况
 
使用不等于操作符(<>、!=)
通常把不等于操作符改成OR条件,就可以使用索引,以避免全表扫描
  使用IS NULL 或IS NOT NULL
使用IS NULL 或IS
NOT NULL同样会限制索引的使用。因为NULL值并没有被定义。在SQL语句中使用NULL会有很多的麻烦。因此建议开发人员在建表时,把需要索引的列设成NOT
NULL。如果被索引的列在某些行中存在NULL值,就不会使用这个索引(除非索引是一个位图索引)。
 
使用函数
如果不使用基于函数的索引,那么在SQL语句的WHERE子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引。
 
比较不匹配的数据类型
不匹配的数据类型之间比较会让Oracle自动限制索引的使用,即便对这个查询执行Explain
Plan也不能让您明白为什么做了一次”全表扫描”。
 
复合索引中的前导列没有被作为查询条件
复合索引中,一定要将前导列作为查询条件,索引才会被使用
 
CBO模式下选择的行数比例过大,优化器采取了全表扫描
这是基于代价的优化考虑
<!--NEWSZW_HZH_END--&gt

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30166976/viewspace-1743812/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30166976/viewspace-1743812/

# 位图索引与B+树索引区别 位图索引(Bitmap Index)B+树索引(B+Tree Index)是数据库中两种重要的索引结构,它们在设计原理应用场景上有显著差异: ## 1. 基本结构差异 **位图索引**: - 使用位图(bit array)表示数据 - 每个索引值对应一个位向量 - 位值为1表示该行包含该索引- 适合低基数(不同值少)的列 **B+树索引**: - 平衡多路搜索树结构 - 所有叶子节点通过指针链接形成有序链表 - 适合高基数(不同值多)的列 ## 2. 适用场景对比 | 特性 | 位图索引 | B+树索引 | |--------------------|----------------------------------|----------------------------------| | 基数要求 | 低基数(如性别、状态等) | 高基数(如ID、时间戳等) | | 数据修改频率 | 适合读多写少的场景 | 适合频繁更新的场景 | | 查询类型 | 适合等值查询多条件AND/OR组合查询 | 适合范围查询排序操作 | | 并发性能 | 锁粒度大,并发写入性能差 | 锁粒度小,并发性能好 | | 存储空间 | 基数低时非常紧凑 | 需要更多存储空间 | ## 3. 性能特点 **位图索引优势**: - 多条件查询时可通过位运算快速合并结果 - 对低基数数据压缩率极高 - 统计计算非常高效 **B+树索引优势**: - 支持高效的范围查询(>, <, BETWEEN) - 支持部分匹配查询(LIKE 'abc%') - 插入、删除、更新操作效率高 - 天然保持数据有序性 ## 4. 实现示例 **位图索引存储示例**: ``` 值 行1 行2 行3 行4 男 1 0 1 0 女 0 1 0 1 ``` **B+树索引结构**: ``` [10, 20, 30] / | \ [5,8,10] [15,17,20] [25,28,30] ``` ## 5. 数据库支持情况 - **位图索引**:Oracle、SQL Server等商业数据库支持,MySQL不原生支持 - **B+树索引**:所有主流数据库都支持,是默认索引类型 ## 6. 选择建议 - 选择**位图索引**当: - 列的不同值少于100个 - 数据仓库环境(读多写少) - 需要频繁执行多条件组合查询 - 选择**B+树索引**当: - 列有大量不同值 - OLTP环境(频繁更新) - 需要范围查询或排序
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值