位图索引

标签: sql 索引
7人阅读 评论(0) 收藏 举报
分类:

原文地址:https://www.cnblogs.com/mafeng/p/7909450.html

位图(BitMap)索引

前段时间听同事分享,偶尔讲起Oracle数据库的位图索引,顿时大感兴趣。说来惭愧,在这之前对位图索引一无所知,因此趁此机会写篇博文介绍下位图索引。

1. 案例

  有张表名为table的表,由三列组成,分别是姓名、性别和婚姻状况,其中性别只有男和女两项,婚姻状况由已婚、未婚、离婚这三项,该表共有100w个记录。现在有这样的查询:     select * from table where Gender=‘男’ and Marital=“未婚”;

姓名(Name)

性别(Gender)

婚姻状况(Marital)

张三

已婚

李四

已婚

王五

未婚

赵六

离婚

孙七

未婚

...

...

...

 

1)不使用索引

  不使用索引时,数据库只能一行行扫描所有记录,然后判断该记录是否满足查询条件。

2)B树索引

  对于性别,可取值的范围只有'男','女',并且男和女可能各站该表的50%的数据,这时添加B树索引还是需要取出一半的数据, 因此完全没有必要。相反,如果某个字段的取值范围很广,几乎没有重复,比如身份证号,此时使用B树索引较为合适。事实上,当取出的行数据占用表中大部分的数据时,即使添加了B树索引,数据库如oracle、mysql也不会使用B树索引,很有可能还是一行行全部扫描。

2. 位图索引出马

如果用户查询的列的基数非常的小, 即只有的几个固定值,如性别、婚姻状况、行政区等等。要为这些基数值比较小的列建索引,就需要建立位图索引。

对于性别这个列,位图索引形成两个向量,男向量为10100...,向量的每一位表示该行是否是男,如果是则位1,否为0,同理,女向量位01011。

RowId

1

2

3

4

5

...

1

0

1

0

0

 

0

1

0

1

1

 

 

  对于婚姻状况这一列,位图索引生成三个向量,已婚为11000...,未婚为00100...,离婚为00010...。

RowId

1

2

3

4

5

...

已婚

1

1

0

0

0

 

未婚

0

0

1

0

1

 

离婚

0

0

0

1

0

 

   当我们使用查询语句“select * from table where Gender=‘男’ and Marital=“未婚”;”的时候 首先取出男向量10100...,然后取出未婚向量00100...,将两个向量做and操作,这时生成新向量00100...,可以发现第三位为1,表示该表的第三行数据就是我们需要查询的结果。 

RowId

1

2

3

4

5

1

0

1

0

0

and

 

 

 

 

 

未婚

0

0

1

0

1

结果

0

0

1

0

0

3.位图索引的适用条件

  上面讲了,位图索引适合只有几个固定值的列,如性别、婚姻状况、行政区等等,而身份证号这种类型不适合用位图索引。

  此外,位图索引适合静态数据,而不适合索引频繁更新的列。举个例子,有这样一个字段busy,记录各个机器的繁忙与否,当机器忙碌时,busy为1,当机器不忙碌时,busy为0。

  这个时候有人会说使用位图索引,因为busy只有两个值。好,我们使用位图索引索引busy字段!假设用户A使用update更新某个机器的busy值,比如update table set table.busy=1 where rowid=100;,但还没有commit,而用户B也使用update更新另一个机器的busy值,update table set table.busy=1 where rowid=12; 这个时候用户B怎么也更新不了,需要等待用户A commit。

  原因:用户A更新了某个机器的busy值为1,会导致所有busy为1的机器的位图向量发生改变,因此数据库会将busy=1的所有行锁定,只有commit之后才解锁。



查看评论

SQL Server 2014 索引和游标

主讲内容: 第一讲 课程简介 第二讲 索引简介 第三讲 创建索引 第四讲 查看索引 第五讲 索引管理 第六讲 全文索引 等课程
  • 2017年01月19日 11:00

数据库位图索引的优缺点

数据库BTree索引、Hash索引、Bitmap位图索引的优缺点  (2016-01-05 17:13:40) 转载▼ http://www.devnote.cn/article/360.h...
  • pzqingchong
  • pzqingchong
  • 2016-03-24 15:02:54
  • 3387

创建位图索引

创建位图索引 位图索引 1位图索引与B树索引不同,位图索引不存储rowid值(数据实际物理地址),也不存储键值。 2在特殊的列上创建位图 索引.3特殊的列是指该列的基数很低的列(基数:列值的数量...
  • zhou920786312
  • zhou920786312
  • 2017-05-28 10:00:54
  • 1312

Oracle关于位图索引的创建与应用

1)创建   CREATE BITMAP INDEX index_name ON normal_index_creation_clause;   Oracle创建一系列的位图,每个位图都与...
  • yxl626571494
  • yxl626571494
  • 2016-03-13 10:55:38
  • 3969

Oracle位图索引

一.什么是位图索引 我们目前大量使用的索引一般主要是B*Tree索引,在索引结构中存储着键值和键值的RowID,并且是一一对应的. 而位图索引主要针对大量相同值的列而创建(例如:类别,操作员,部门...
  • ItJavawfc
  • ItJavawfc
  • 2014-07-24 08:52:31
  • 825

《Oracle SQL优化基础》之位图索引(BitMap index)

有不少做BI的后台同事问我,位图索引是啥?啥时候用? 此篇仅作为一个扫盲篇,有不对的地方欢迎大神指正。 首先我们要搞明白位图索引是什么,与普通的B*树索引有什么区别呢? 顾名思义,首先他是个索引(...
  • doupeihua
  • doupeihua
  • 2016-08-13 19:25:37
  • 2823

(09)项目中的位图索引误用

我前篇说了一堆乱加索引的情况,但总得来说开发通常都很好学的,有时也会翻翻数据库性能优化的书,也常常会被书中的一些新特性或名词所吸引,而尝试使用它们。不乏成功案例,但误用特性的情况也不少,其中索引被误用...
  • xcltapestry
  • xcltapestry
  • 2013-12-06 00:10:12
  • 1555

Oracle中的位图索引是什么?

1、语法 create bitmap index index_name on 表名(字段); 2、举个例子你就能明白了: 如有表 test(id,name,address) 数据 (1,张三,大连) ...
  • u011478909
  • u011478909
  • 2016-05-22 13:38:57
  • 298

位图索引:原理(BitMap index)

http://www.cnblogs.com/LBSer/p/3322630.html 位图(BitMap)索引   前段时间听同事分享,偶尔讲起Oracle数据库的位图索引,顿时大感兴趣...
  • donglynn
  • donglynn
  • 2015-11-03 16:49:31
  • 1372

B-树索引与位图索引

/*刚从书上看到了位图索引,自己经过了测试,于是现学现卖,希望对还不了解的人有所帮助*/ B-树索引在Oracle中是一个通用的索引,在创建索引时它就是默认的索引类型。最多可以包括32列。 位图索引O...
  • heyixiang
  • heyixiang
  • 2005-09-16 16:10:00
  • 6085
    个人资料
    持之以恒
    等级:
    访问量: 723
    积分: 310
    排名: 23万+
    文章存档