索引:位图索引理解

索引:位图索引理解1 案例 有张表名为 table 的表 由三列组成 分别是姓名 性别和婚姻状况 其中性别只有男和女两项 婚姻状况由已婚 未婚 离婚这三项 该表共有 100w 个记录 现在有这样的查询 nbsp nbsp nbsp select fromtablewhe 男 andMarital 未婚 姓名 Name 性别 Gender 婚

1. 案例

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

姓名(Name)

性别(Gender)

婚姻状况(Marital)

张三

已婚

李四

已婚

王五

未婚

赵六

离婚

孙七

未婚

 

1)不使用索引

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

2)B树索引

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

2. 位图索引出马

位图索引创建了之后,生成是位图数据可以这么理解,比如,男女两种,然后一共八条数据,那么就生产两个字符串,一个代表男,一个代表女,字符串长度为数据的总数量,字符串的值:第一位(如果第一条数据是男那么就是1,如果不是就0),第二位,第三位,往后都是这样。由此就生成了长度为总数量,只包含01的字符串,通过这个字符串就能知道第几条数据是男,第几条不是男,同理,另外一条代表女的字符串也一样,是女的就1,不是女的就0。

 

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

对于性别这个列,位图索引形成两个向量,男向量为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之后才解锁。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/202393.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午7:15
下一篇 2026年3月20日 上午7:15


相关推荐

  • OpenClaw 超详细安装教程|教你拥有专属AI员工

    OpenClaw 超详细安装教程|教你拥有专属AI员工

    2026年3月13日
    2
  • yum 安装nginx_yum安装nginx

    yum 安装nginx_yum安装nginx前言:日常外出工作系统都是最小化安装,导致很多包都无法下载,需要自己手动安装包yum源以centos7.5为例在官网下载CentOS-7-x86_64-Everything-1804.iso上传到对应的服务器将镜像源挂载到对应的目录mount-oloop/opt/CentOS-7-x86_64-Everything-1804.iso/opt/yumrepo/tips:目录可以自定义修改路径/etc/yum.repos.dvirhel79.repo[rhel79]na

    2022年8月12日
    6
  • 以太网协议号字段定义

    以太网协议号字段定义当前使用的以太网协议一般指 EthernetII 协议 它是 Xerox 与 DEC Intel 等公司在 1982 年制定的以太网标准帧格式 在当时是一种事实工业标准 到 1985 年 IEEE 又发布了 802 3 802 2 以太网标准 这两种标准都规定以太网 MAC 地址为 6 字节 但对以太网首部第 13 14 字节的定义却不同 在 EthernetII 中 对这两字节的定义为上层协议类型字段 而在 802 3 中 却将这两字节定义

    2026年3月16日
    2
  • 整合Flex和Java—配置篇

    整合Flex和Java—配置篇作为一个 Java 程序员学习 Flex 关心的就是怎样将 Flex 和 Java 进行结合交互 带着 Java 程序员的思维 一开始学习 Flex 并没有按部就班的学习 Flex 的基础知识 而是想搞清楚 Flex 到底怎样和 Java 交互的 经过了一个周末的研究 终于初见成果 下面就重要的讲解三种配置的两个 http bbs airia cn FLEX thread 72 1 1 aspx

    2026年3月26日
    2
  • cv2.imread()和cv2.cvtColor() 的使用

    cv2.imread()和cv2.cvtColor() 的使用1 cv2 imread 接口读图像 读进来直接是 BGR 格式数据格式在 0 255 需要特别注意的是图片读出来的格式是 BGR 不是我们最常见的 RGB 格式 颜色肯定有区别 2 cv2 cvtColor p1 p2 是颜色空间转换函数 p1 是需要转换的图片 p2 是转换成何种格式 cv2 COLOR BGR2RGB 将 BGR 格式转换成 RGB 格式 cv2 COLOR BGR2GRAY 将

    2026年3月19日
    2
  • 二分查找

    二分查找

    2021年12月5日
    34

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号