bitmap位图索引技术占用的存储空间_bitmap位图

bitmap位图索引技术占用的存储空间_bitmap位图参考https://www.cnblogs.com/lbser/p/3322630.htmlhttps://blog.csdn.net/catoop/article/details/1116897771、案例有张表名为table的表,由三列组成,分别是姓名、性别和婚姻状况,其中性别只有男和女两项,婚姻状况由已婚、未婚、离婚这三项,该表共有100w个记录。现在有这样的查询:select*fromtablewhereGender=‘男’andMarital=“未婚”;姓

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

参考
https://www.cnblogs.com/lbser/p/3322630.html
https://blog.csdn.net/catoop/article/details/111689777

1、案例

有张表名为table的表,由三列组成,分别是姓名、性别和婚姻状况,其中性别只有男和女两项,婚姻状况由已婚、未婚、离婚这三项,该表共有100w个记录。现在有这样的查询: select * from table where Gender=‘男’ and 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、位图索引的适用场景

BitMap索引适用场景

  1. 建在值重复度高的列上,GP手册建议在100到100,000之间,如:职业、地市等。重复度过高则对比其他类型索引没有明显优势;重复度过低,则空间效率和性能会大大降低。
  2. 特定类型的查询例如count、or、and等逻辑操作因为只需要进行位运算。如:通过多个条件组合查询,select count(*) from table where city = ’南京市’ and job = ’医生’ and phonetype = ‘iphone’ and gender =’男’。类似这种场景,如果在每个查询条件列上都建立了bitmap索引,则数据库可以进行高效的bit运算,精确定位到需要的数据,减少磁盘IO。并且筛选出的结果集越小,bitmap索引的优势越明显。
  3. 适用于即席查询、多维分析等OLAP场景。如果有一张表有100列,用户会使用其中的20 个列作为查询条件(任意使用这20个列上的N的列),几乎没有办法创建合适的 b-tree 索引。但是在这些列上创建 20 个 bitmap 索引,那么所有的查询都可以应用到索引。

BitMap索引不适用场景

  1. 值重复度低的列,如:身份证号、手机号码等。
  2. 重复度过低的列,如:性别,可以建立bitmap索引,但不建议单独作为查询条件使用,建议与其他条件共同过滤。
  3. 经常需要更新修改的列。
  4. 不适用于OLTP场景。

举个例子,有这样一个字段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/226937.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 睿智的目标检测26——Pytorch搭建yolo3目标检测平台[通俗易懂]

    睿智的目标检测26——Pytorch搭建yolo3目标检测平台[通俗易懂]睿智的目标检测26——Pytorch搭建yolo3目标检测平台学习前言源码下载yolo3实现思路一、预测部分1、主题网络darknet53介绍2、从特征获取预测结果3、预测结果的解码4、在原图上进行绘制二、训练部分1、计算loss所需参数2、pred是什么3、target是什么。4、loss的计算过程训练自己的yolo3模型学习前言一起来看看yolo3的Pytorch实现吧,顺便训练一下自己的…

    2022年9月18日
    3
  • latex大括号错位显示_LaTeX表格

    latex大括号错位显示_LaTeX表格amsmath中\smash妙用样例-大括号错位显示。原始大括号显示\[\text{机器学习}\begin{cases}\text{~~监督学习~}{\begin{cases}\text{回归算法}\\\text{分类算法}{\begin{cases}\text{生成模型}\\\text{判别模型}\end{cases}}

    2022年10月11日
    5
  • HTTP接口测试还可以这么玩[通俗易懂]

    HTTP接口测试还可以这么玩[通俗易懂]1、背景  随着H5在各行业领域的运用,无论是在APP内嵌入H5页面的hybrid应用还是直接在微信公众号或者轻应用中使用H5页面都是非常的常见(比如前端页面通过HTTP接口调用拉取数据进行交互,实现前后台分离)。而随着此类技术的应用和发展,作为一个测试人员,跟上时代的变化,除了保证前端页面UI的正确性,也要保证HTTP接口的正确性,从而保证了整个业务功能逻辑的正确性,而接口如果手工测

    2022年5月11日
    44
  • PyCharm的配置(背景颜色+字体大小+行号+解释器选择等)

    PyCharm的配置(背景颜色+字体大小+行号+解释器选择等)我的第二篇博客,上一篇是PyCharm安装过程,下面讲解PyCharm的配置。第一:配置PyCharm的背景。打开PyCharm开发环境,使用快捷键Ctrl+"`"(该键位于键盘的左上角,和”~“同一个键位),即可出现下图配置选项。colorScheme:配置背景颜色(有白色,黑色等)codestylescheme:默认为defaultKeymap:快捷键配置,依个人习惯而定Vie…

    2022年6月20日
    25
  • 二分查找的Java实现「建议收藏」

    目录写在前面二分查找的原理代码实现学习感想写在前面二分查找是一个很有趣的算法,可以很大程度的提升性能,比如待查询的数组或其他集合很大的时候,二分查找的威力就可以体现出来。但是平时的工作中我们基本上不会去写二分查找,所以我觉得有必要写一篇博文来记录二分查找的学习。二分查找的原理所谓二分查找,其实就是获取一组有序数据的中间数据,判断其跟查询关键字的…

    2022年4月14日
    33
  • 开关三极管的导通和截止条件「建议收藏」

    开关三极管的导通和截止条件「建议收藏」转自:https://blog.csdn.net/ruanjianruanjianruan/article/details/38523973三极管在我们数字电路和模拟电路中都有大量的应用,在我们开发板上也用了多个三极管。在我们板子上的LED小灯部分,就有这个三极管的应用了,图3-5的LED电路中的Q16就是一个PNP型的三极管。图3-5 LED电路三极管的初步认识三极管是一…

    2022年6月16日
    138

发表回复

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

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