数据库索引提高检索效率的根本原因

我是这样理解的:
索引可以理解为另一个由原表生成的子表(提取建立索引的列)
另外再加一列暂且称为指针列
此列内的指针直接指向在原表内与该列相匹配的行
索引建立之后若查询筛选条件列建立过索引则进入该“索引表”查询
然后再到 查询结果的指针列所指向的行 里去取数据

但是,我不觉得这样跟直接在表内查询有什么区别,如:
SELECT * FROM 表 WHERE ID=11
这行语句在表A(含ID,NAME.SEX等等N列)内执行时     计算机应该只会在ID列检索值为11的行
在表B(仅含ID,Point 两列,相当于表A的索引)内执行时 计算机依然只在ID列检索值为11的行,然后通过指针列到原表内取数据

以上是我的理解

书本的目录能加快查找速度的原因在于没有目录的书要浏览整本书的内容,而目录是把内容分类分章节,我们查找的时候依然需要浏览整个目录,但是由于目录内容少于是我们能迅速找到想要的内容
而数据库内难道也是这样的么?就拿SELECT * FROM T1 WHERE ID=11为例,难道我告诉计算机WHERE ID=11才是我要的结果,计算机还会去查询表内其他列的内容(相当于人浏览整本书)么?如果答案是”否“ 那么我想 有索引 和 没索引 查询的时间差应该来自掠过那些不需要检索的列的时间,也就是:
没索引的时候确实是只查询表的特定列 

只是时间花在了跳过无需检索的列上
这是我唯一能想到的原因了
但是…真是这样么?
如果不是……那提高查询速度的根本原因又是什么呢?
不知道我说清楚没,感觉有的话要仔细揣摩一下才能看明白……

对你的理解,我表示万分赞赏,当然不表示我赞同,因为在看你此文时,我也不见得有多好的理解,我赞赏你是因为你看问题的深度,有点小水平.他表示,你在认真思考这个问题。
  你的思考有一定的道理。计算机在查资料时,也和人的眼睛一样的,要从第几个字到最后一个字,无论是数据库,还是文件,无论是.txt .html 还是.exe,都是一样的,索引的目的,就在于当有大量的文字要读时,(你在这里举的书的例子,很恰当。目录就是干这个事的) 如果你搞过软件破解,会用到一些读源码的工具,他里面有一个jump语句,后面跟的就是一个数字,表示跳到那里去执行。理论上,你放入内存中的每一个东西,都必须有一个索引。也就是原来的指针。来方便程序控制流程。---这点和你想的类同,只是放在内存中了。。
  在你的想法中,可能搞不明白,SELECT * FROM 表 WHERE ID=11 和建立了索引的表有什么区别,这里,你可能是没有分清一个事,我说是可能,那就是你这个语句中用的条件where id 这里的id,很可能是你在建数据库时已经把他指定为自动增加,或者把他指定为primary key 那么此时,事实上数据库已经为此id自动加了一个索引,你这时再给id建个索引,用那个b表,那实际上是多做了一边而已,他们在时间上没有任何区别。
  但是,如果你原来的那个id,不是自动增量,也没有设成key,也没有做任何与索引或自动索引相观的操作的话,那这里的id将和你插入数据库中的其他值如,name,sex,tel一样,是一堆记录,当你用上面的select语句来查时,程序将从这一堆记录从头读到尾,来看这其中有多少个id=11这样的记录,如果id不是唯一值的话,那读到一堆记录的最后一个字,几乎是必须的。

如果id不是唯一值的话,那读到一堆记录的最后一个字,几乎是必须的。

如果id是唯一值那你指的读到那一堆记录的最后一个字是指除了ID这列以外的列的数据也会读?

是的,如果id不设为关键字,也没有建索引的话
这里关键字和索引是这样的,如果一个字段被设为关键字,他会自动被建立索引,而且关键字是不能有重复的,索引的话,就是重新建了一个表,并按一定的顺序进行排列,可以有重复的值.比如手机上的通讯录,第几个就可以设成关键字,而姓名可以建索引,这样当两个同姓的人出现时,比如都姓张,他们会被排在以z建立的索引那里

作者: ljj02   发布时间: 2010-09-13