怎么做跳转不影响原网站排名,图们市建设局网站,服装网页怎么制作,接单网官网摘自http://www.cnblogs.com/LBSer/p/3322630.html 位图#xff08;BitMap#xff09;索引 前段时间听同事分享#xff0c;偶尔讲起Oracle数据库的位图索引#xff0c;顿时大感兴趣。说来惭愧#xff0c;在这之前对位图索引一无所知#xff0c;因此趁此机会写篇博文介绍下… 摘自http://www.cnblogs.com/LBSer/p/3322630.html 位图BitMap索引 前段时间听同事分享偶尔讲起Oracle数据库的位图索引顿时大感兴趣。说来惭愧在这之前对位图索引一无所知因此趁此机会写篇博文介绍下位图索引。 1. 案例 有张表名为table的表由三列组成分别是姓名、性别和婚姻状况其中性别只有男和女两项婚姻状况由已婚、未婚、离婚这三项该表共有100w个记录。现在有这样的查询 select * from table where Gender‘男’ and Marital“未婚”; 姓名(Name) 性别(Gender) 婚姻状况(Marital) 张三 男 已婚 李四 女 已婚 王五 男 未婚 赵六 女 离婚 孙七 女 未婚 ... ... ... 1不使用索引 不使用索引时数据库只能一行行扫描所有记录然后判断该记录是否满足查询条件。 2B树索引 对于性别可取值的范围只有男,女并且男和女可能各站该表的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.busy1 where rowid100;但还没有commit而用户B也使用update更新另一个机器的busy值update table set table.busy1 where rowid12; 这个时候用户B怎么也更新不了需要等待用户A commit。 原因用户A更新了某个机器的busy值为1会导致所有busy为1的机器的位图向量发生改变因此数据库会将busy1的所有行锁定只有commit之后才解锁。 以下内容转载自https://blog.csdn.net/pzqingchong/article/details/50971854 当前测试的版本是Mysql 5.5.25只有BTree和Hash两种索引类型默认为BTree。Oracle或其他类型数据库中会有Bitmap索引位图索引这里作为比较也一起提供。 BTree索引 BTree多路搜索树并不是二叉的是一种常见的数据结构。使用BTree结构可以显著减少定位记录时所经历的中间过程从而加快存取速度。按照翻译B 通常认为是Balance的简称。这个数据结构一般用于数据库的索引综合效率较高。——百度百科 不适合 单列索引的列不能包含null的记录复合索引的各个列不能包含同时为null的记录否则会全表扫描不适合键值较少的列重复数据较多的列前导模糊查询不能利用索引(like %XX或者like %XX%) Hash散列索引 Hash散列索引是根据HASH算法来构建的索引。虽然 Hash 索引效率高但是 Hash 索引本身由于其特殊性也带来了很多限制和弊端主要有以下这些。 适合 精确查找非常快包括 和in其检索效率非常高索引的检索可以一次定位不像BTree 索引需要从根节点到枝节点所以 Hash 索引的查询效率要远高于 B-Tree 索引。不适合 不适合模糊查询和范围查询包括likebetween……and等由于 Hash 索引比较的是进行 Hash 运算之后的 Hash 值所以它只能用于等值的过滤不能用于基于范围的过滤因为经过相应的 Hash 算法处理之后的 Hash 值的大小关系并不能保证和Hash运算前完全一样不适合排序数据库无法利用索引的数据来提升排序性能同样是因为Hash值的大小不确定复合索引不能利用部分索引字段查询Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值而不是单独计算 Hash 值所以通过组合索引的前面一个或几个索引键进行查询的时候Hash 索引也无法被利用。同样不适合键值较少的列重复值较多的列 Bitmap位图索引 就是用位图表示的索引对列的每个键值建立一个位图。相对于BTree索引占用的空间非常小创建和使用非常快。位图索引由于只存储键值的起止Rowid和位图,占用的空间非常少。如test表中有state这样一列10行数据如下 10 20 30 20 10 30 10 30 20 30 那么会建立三个位图如下 BLOCK1 KEY10 1 0 0 0 1 0 1 0 0 0 BLOCK2 KEY20 1 0 0 0 1 0 1 0 0 0 BLOCK3 KEY30 1 0 0 0 1 0 1 0 0 0 适合 适合决策支持系统当select count(XX) 时,可以直接访问索引中一个位图就快速得出统计数据当根据键值做andor或 in(x,y,..)查询时直接用索引的位图进行或运算,快速得出结果行数据。不适合 不适合键值较多的列重复值较少的列不适合update、insert、delete频繁的列代价很高。转载于:https://www.cnblogs.com/yedu/p/9198724.html