B树索引
主键和唯一性约束字段的B树索引,效率几乎和海量数据没有关系。

键值重复率低的字段比较适合使用B树索引。

位图索引
键值重复率高的字段比较适合使用位图索引。
count、and、or、in这些特定的操作更适合位图索引。

DML操作比较多的表不适合使用位图索引。

复合索引
在where条件中必须带驱动列,复合索引才会使用。

键值重复率低(DISTINCT数量多)的字段放在前面。

用实验说明为什么位图索引不适合OLTP,比较适合OLAP。即:DML操作比较多的表不适合使用位图索引。

首先创建测试表:

  1. SQL> create table t1(id int,name varchar(10),value varchar(10));
  2. 表已创建。
  3. SQL> create bitmap index ind_t1_id on t1(id);
  4. 索引已创建。
  5. SQL> insert into t1 values(1,'a','aa');
  6. 已创建 1 行。
  7. SQL> insert into t1 values(1,'b','bb');
  8. 已创建 1 行。
  9. SQL> commit;
  10. 提交完成。
  11. SQL> select * from t1;
  12. ID NAME       VALUE
  13. ---------- ---------- ----------
  14. 1 a          aa
  15. 1 b          bb

session1:

  1. SQL> select distinct sid from v$mystat;
  2. SID
  3. ----------
  4. 140
  5. SQL> update t1 set id = 2 where name = 'a';
  6. 已更新 1 行。

session2:

  1. SQL> select distinct sid from v$mystat;
  2. SID
  3. ----------
  4. 147
  5. SQL> update t1 set id = 2 where name = 'b';

阻塞信息:

  1. SQL> select * from v$lock where sid in(140,147) order by type;
  2. ADDR     KADDR           SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK
  3. -------- -------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
  4. 288F60DC 288F60F4        147 TM      55628          0          3          0        111          0
  5. 288F6030 288F6048        140 TM      55628          0          3          0        270          0
  6. 28945B40 28945B64        147 TX     655404        533          6          0        111          0
  7. 28939F60 28939F84        140 TX     589829        616          6          0        270          1
  8. 294344A8 294344BC        147 TX     589829        616          0          4        111          0
  9. SQL> select sid,status,last_call_et,blocking_session from v$session where sid in(140,147);
  10. SID STATUS   LAST_CALL_ET BLOCKING_SESSION
  11. ---------- -------- ------------ ----------------
  12. 140 INACTIVE          285
  13. 147 ACTIVE            126              140

可以看见140阻塞了147。尽管他们修改的不是同一列。

注意:这里不仅仅是根据name='a'去修改会阻塞其他会话,如果根据value = 'aa'或者name = 'a' and value = 'aa'来修改操作,也是同样会阻塞的!!! 因为都是改的id的值,而Index就是建在id上面的。但是如果不是改id列,而是改name或者value列就不存在阻塞的情况!!!

如果使用B树索引,就不存在阻塞情况了。创建同样的t2表,只是索引不一样

  1. SQL> create table t2 as select * from t1;
  2. 表已创建。
  3. SQL> select * from t2;
  4. ID NAME       VALUE
  5. ---------- ---------- ----------
  6. 2 a          aa
  7. 2 b          bb
  8. SQL> create index ind_t2_id on t2(id);
  9. 索引已创建。

session1:

  1. SQL> select distinct sid from v$mystat;
  2. SID
  3. ----------
  4. 140
  5. SQL> update t2 set id = 1 where name = 'a';
  6. 已更新 1 行。

session2:

  1. SQL> select distinct sid from v$mystat;
  2. SID
  3. ----------
  4. 147
  5. SQL> update t2 set id = 1 where name = 'b';
  6. 已更新 1 行。

可以看见,各自都可以修改,不存在阻塞现象!

B树索引和位图索引的区别!的更多相关文章

  1. [转帖]B树索引、位图索引和散列索引

    B树索引.位图索引和散列索引   https://blog.csdn.net/huashanlunjian/article/details/84460436 索引在数据结构上可以分为三种B树索引.位图 ...

  2. [转帖]B树索引和位图索引的结构介绍

    B树索引和位图索引的结构介绍 http://blog.itpub.net/12679300/viewspace-1174236/ 一  前言:? ROWID:包含键值的行的行ID,(查找块的最快方法, ...

  3. Atitit 索引技术--位图索引

    Atitit 索引技术--位图索引 索引在数据结构上可以分为三种B树索引.位图索引和散列索引 存储原理 编辑 位图索引对数据表的列的每一个键值分别存储为一个位图,Oracle对于不同的版本,不同的操作 ...

  4. Oracle索引梳理系列(四)- Oracle索引种类之位图索引

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

  5. Oracle索引——位图索引

    1.语法create bitmap index index_name on 表名(字段);2.举个例子你就能明白了:如有表 test(id,name,address)数据(1,张三,大连)(2,李四, ...

  6. Oracle - 位图索引的适用条件

    位图索引的适用条件 位图索引适合只有几个固定值的列,如性别.婚姻状况.行政区等等,而身份证号这种类型不适合用位图索引. 位图索引适合静态数据,而不适合索引频繁更新的列. 举个例子,有这样一个字段bus ...

  7. oracle的位图索引和函数索引

    1.位图索引 位图索引适用于性别.婚姻状态.行政区等只有几列固定值的类型列,身份证号等就不适合位图索引,位图索引适用于静态数据,频繁更新的字段不适用建立位图索引,因为更新会导致索引块区的变更,还会引起 ...

  8. ( 转 ) 数据库BTree索引、Hash索引、Bitmap位图索引的优缺点

    测试于:MySQL 5.5.25 当前测试的版本是Mysql 5.5.25只有BTree和Hash两种索引类型,默认为BTree.Oracle或其他类型数据库中会有Bitmap索引(位图索引),这里作 ...

  9. Oracle索引之Btree索引

    索引介绍 日常开发中,对于数据的查询如果需要优化,常听说要加个索引.但是为什么加了索引,数据的查询就快了呢?那是不是加了索引就一定会是有效或者有利的呢? Oracle中常见有BTREE索引,位图索引和 ...

随机推荐

  1. 解决jquery版本冲突问题

    解决jQuery1.3.2和1.4.2的冲突.(测试通过) 第一步:在1.4.2的源代码的最后加上一句 var $j4 = jQuery.noConflict(true);//之所以在源码这里加,而不 ...

  2. Ubuntu下非常给力的下载工具--uget+aria2

    转自Ubuntu下非常给力的下载工具--uget+aria2 Windows下的下载工具--迅雷,之所以下载速度快,乃是它能搜索资源.为己所用,而不是仅仅从原始地址这单一资源处下载. Ubuntu下也 ...

  3. 消除SDK更新时的“https://dl-ssl.google.com refused”异常

    原地址:http://blog.csdn.net/x605940745/article/details/17911115 消除SDK更新时的“https://dl-ssl.google.com ref ...

  4. POJ 1486 Sorting Slides(寻找必须边)

    题意:找出幻灯片与编号唯一对应的情况 思路: 1:求最大匹配,若小于n,则答案为none,否则转2 (不过我代码没有事先判断一开始的最大匹配数是否<n,但这样也过了,估计给的数据最大匹配数一定为 ...

  5. ZOJ 3791 An Easy Game(DP)

    题目链接 题意 : 给你两个长度为N的字符串,将第一个字符串每次只能变化M个,问变换K次之后变成第二个字符串一共有几种方法. 思路 : DP.dp[i][j]表示变了 i 次之后有j个不一样的字母的方 ...

  6. hdu 3579 Hello Kiki

    不互质的中国剩余定理…… 链接http://acm.hdu.edu.cn/showproblem.php?pid=3579 #include<iostream>#include<st ...

  7. [SQL Server 系] T-SQL数据库的创建与修改

    创建数据库 USE master; GO CREATE DATABASE ToyUniverse ON ( NAME = ToyUniverse_Data, FILENAME = 'F:\Projec ...

  8. mysql小记--基础知识

    一.事务 事务是由一组SQL语句组成的逻辑处理单元. 事务的特征ACID,即原子性.一致性.隔离性和持久性. 原子性(Atomicity)事务作为整体执行,操作要么全部执行.要么全部不执行. 一致性( ...

  9. lintcode :最长单词

    题目: 最长单词 给一个词典,找出其中所有最长的单词. 样例 在词典 { "dog", "google", "facebook", &quo ...

  10. 毕向东JAVA视频讲解(第七课)

    构造函数:构建创造对象时调用的函数.作用:可以给对象进行初始化. 创建对象都必须要通过构造函数初始化. 一个类中如果没有定义过构造函数,那么该类中会有一个默认的空参数构造函数. 如果在类中定义了指定的 ...