零基础学习sql(5)---索引

来源:互联网 发布:exo light软件 编辑:程序博客网 时间:2024/06/06 00:10

终于到索引了。。。

 

     零基础的人是对索引来讲是感兴趣,也想懂,我在实体班级,给很多跨IT 专业的人讲课(真正的零零基础,可以让很多人改变他的人生,我觉得对我来讲就是一个成功,

现在实体上课的学生累计超过50人)  :

     索引类似字典目录,要去查找某个汉字,需要翻索引,不然就要把整个字典全部搜索,

索引结构图,如下图:

 索引由三层组成, root, branch, leaf 

其中叶子节点是存储 列值和rowid 的, 对于零基础的人,确实不知道什么是rowid,

rowid 可以理解为门牌号码, 比如快递员去给大家送快递,是不是通过门牌号码去定位大家的位置的? 一样的,就有rowid 了

那什么是rowid 呢?

 

rowid 的组成是由对象号(可以理解为表),文件号,块号组成

 

简单例子:


SQL> drop table t;

表已删除。

SQL> create table t(a int);

表已创建。

SQL> insert into t values(5);

已创建 1 行。

SQL> commit;

提交完成。

SQL> select a,rowid from t;

         A ROWID
---------- ------------------
         5 AAASjTAAEAAAd3WAAA

 

我们访问这一行 就可以

SQL> select * from t where rowid ='AAASjTAAEAAAd3WAAA';

         A
----------
         5

 

这个rowid 就是伪列的概念,什么是伪列?  就是有不是你创建的,但是能查询出来的。。。

懂了吧。。。

 

具体rowid 的组成,没什么好看的,大家可以去百度。

 

大家理解索引的rowid 是门牌号码即可,是物理地址即可。

 

那么索引是怎么通过树形结构找到rowid 的呢,我们再来看一个图片:

 

讲这个之前,给大家讲下二分法的概念,

我举个例子,假如我有1到100, 那么我们查找30 ,怎么找

根据二分法是这样找的

1到100,是中间的50, 那么30是大于1,小于50,那么又二分,到25和50 ,然后又二分到25到37,然后继续二分,是25 到31, 然后二分是28到31

然后再二分就是30。

索引的树查询也是这种,对于图片里面的值,类似的查找到,但是oracle 为什么叫平衡树索引结构(b*) ,其实就是因为root,branch 都不存储rowid,

都必须到leaf 节点才可以找到 rowid.  查找任何一个值(比如28, 30) 都是一样的io数目(都是3个)

 

我们来创建一个索引:

 

SQL> create index t_idx on t(a);

索引已创建。

SQL> set autot on exp;
SQL> select a from t where a=2;

未选定行


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

--------------------------------------------------------------------------
| Id  | Operation        | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT |       |     1 |    13 |     1   (0)| 00:00:01 |
|*  1 |  INDEX RANGE SCAN| T_IDX |     1 |    13 |     1   (0)| 00:00:01 |
--------------------------------------------------------------------------

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

   1 - access("A"=2)

 

看执行计划里面,可以看出来走了索引。。。

 

没有数据库经验的同学,有个印象就好了,后面我们还会讲,怎么分析索引。。。

这里只是有个概念:

 

 

问题:  1.    如何查询a 表有几个索引, 索引的字段是哪列?

0 0
原创粉丝点击