首页 > 代码库 > SQL基础--索引

SQL基础--索引

索引的概念:

  在数据库中索引是用于提升数据库查询操作性能的一种手段,但在频繁更新的表上,索引反而会降低性能。

 

常用的索引结构:

  •   B*树索引
  •   位图索引

 

B树索引:

  B书索引是最基本的索引结构,Oracle中默认建立的索引类型就是此类型索引,

  一般B数索引在检索高基数数列(该例重复内容较少或没有)的时候可以提供高性能检索

  B书索引采用的就是用的二叉树排列,在叶子节点中有ROWID的值,用ROWID这种方式查询效率是最高的。

 

 B树索引建立语法:

  create index  [用户名.]索引名称  on [用户名.]表名称 (列名称  [asc|desc])

   --默认是ASC

演示:

--没有建立索引的查询:

SQL> set autotrace on     ##开启自动跟踪功能
SQL> select * from scott.emp where sal<1500;

结果:

已用时间:  00: 00: 00.02

执行计划
----------------------------------------------------------
Plan hash value: 3956160932

--------------------------------------------------------------------------
| Id  | Operation      | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |     |     7 |   252 |     3   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| EMP  |     7 |   252 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("SAL"<1500)


统计信息
----------------------------------------------------------
      1  recursive calls
      0  db block gets
      8  consistent gets
      0  physical reads
      0  redo size
       1220  bytes sent via SQL*Net to client
    520  bytes received via SQL*Net from client
      2  SQL*Net roundtrips to/from client
      0  sorts (memory)
      0  sorts (disk)
      5  rows processed

从中可以看出用了全盘扫描

--建立B数索引

SQL> create index emp_sal_ind on emp(sal);

再次追踪:

已用时间:  00: 00: 00.01

执行计划
----------------------------------------------------------
Plan hash value: 317084801

-------------------------------------------------------------------------------------------
| Id  | Operation            | Name      | Rows  | Bytes | Cost (%CPU)| Time      |
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT        |          |    7 |   252 |    2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| EMP      |    7 |   252 |    2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN        | EMP_SAL_IND |    7 |      |    1   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("SAL"<1500)


统计信息
----------------------------------------------------------
      0  recursive calls
      0  db block gets
      4  consistent gets
      0  physical reads
      0  redo size
       1238  bytes sent via SQL*Net to client
    520  bytes received via SQL*Net from client
      2  SQL*Net roundtrips to/from client
      0  sorts (memory)
      0  sorts (disk)
      5  rows processed

 对比上面没建立索引的,可以看出耗费时间和CPU都减少了。

 

查询用户的索引视图

  --user_indexes

SQL> select index_name,index_type,status  from user_indexes;

Index name               Index type      STATUS
------------------------------ --------------- --------
PK_MID                   NORMAL           VALID
PK_EMP                   NORMAL           VALID
EMP_SAL_IND               NORMAL           VALID
PK_DEPT                NORMAL           VALID

主键都自动设置了索引。

  --user_ind_columns

查看索引建在哪个字段上

SQL> select * from user_ind_columns where index_name=EMP_SAL_IND;
 
INDEX_NAME     TABLE_NAME          COLUMN_NAME         COLUMN_POSITION COLUMN_LENGTH CHAR_LENGTH DESCEND
------------------------------ ------------------------------ -----------------------------------------------
EMP_SAL_IND       EMP               SAL                       1            22           0       ASC
 

 

位图索引

  适用于低基数列,重复的数据多

 

创建语法:

  create bitmp index  [用户名.]索引名称  on [用户名.]表名称 (列名称  [asc|desc])

 

实例:

  --在deptno上建立位图索引

 

SQL> create bitmap index emp_deptno_ind on emp(deptno);

 

 

删除索引:

  由于索引本身要进行数据维护,一般而言会占用较大的磁盘空间,随着表的增长会越来越大,对于那些不经常使用的索引应该删除。

删除语法:

  drop index 索引名称;

 

SQL基础--索引