本人对索引一直不理解,也在网上搜索相关资料,看到如下一段文字:
假设我们创建了一个名为people的表:
CREATE TABLE people ( peopleid SMALLINT NOT NULL, name CHAR(50) NOT NULL );
然后,我们完全随机把1000个不同name值插入到people表。我们可知,在数据文件中name列没有任何明确的次序。如果我们创建了name列的索引,我们要查找name等于“Mike”记录的peopleid(SQL命令为“SELECT peopleid FROM people WHERE name=\'Mike\';”),数据库系统能够在name的索引中查找“Mike”值,然后直接转到数据文件中相应的行,准确地返回该行的peopleid(999)。在这个过程中,数据库系统只需处理一个行就可以返回结果。如果没有“name”列的索引,就要扫描数据文件中的所有记录,即1000个记录!上面说到:“如果没有“name”列的索引,数据库系统要扫描数据文件中的所有记录,即1000个记录!” 问题:如果在name列建立了索引,那当你在name列索引中查找“Mike”时,不也是在name列索引中的1000个记录中找“mike”?这样一来不都是在1000个记录中查找"mike"?
希望有人能帮我解惑,让我对索引有个比较正确的认识。本人是初学者,所以回复时希望能通俗易懂,举例说明。
假设我们创建了一个名为people的表:
CREATE TABLE people ( peopleid SMALLINT NOT NULL, name CHAR(50) NOT NULL );
然后,我们完全随机把1000个不同name值插入到people表。我们可知,在数据文件中name列没有任何明确的次序。如果我们创建了name列的索引,我们要查找name等于“Mike”记录的peopleid(SQL命令为“SELECT peopleid FROM people WHERE name=\'Mike\';”),数据库系统能够在name的索引中查找“Mike”值,然后直接转到数据文件中相应的行,准确地返回该行的peopleid(999)。在这个过程中,数据库系统只需处理一个行就可以返回结果。如果没有“name”列的索引,就要扫描数据文件中的所有记录,即1000个记录!上面说到:“如果没有“name”列的索引,数据库系统要扫描数据文件中的所有记录,即1000个记录!” 问题:如果在name列建立了索引,那当你在name列索引中查找“Mike”时,不也是在name列索引中的1000个记录中找“mike”?这样一来不都是在1000个记录中查找"mike"?
希望有人能帮我解惑,让我对索引有个比较正确的认识。本人是初学者,所以回复时希望能通俗易懂,举例说明。
解决方案 »
- 请教个oracle的小问题
- wo表和wro两个有何具体区别
- 外连接的问题
- oracle order by 排序问题~~~
- 各位好:关于oracle的一段代码为什么不输出的问题?
- PL/SQL 怎么读写文件?
- 在SQL中的exec('select * from t1')在oracle中怎么写?
- 新手提问:“decode(acd.fact_cate,'H','891200','891210') as code01”中的列别名和数据库中的字段名的关系是什么?
- 请问如何从View里获得各个Column的Schema?
- win7下oracle客户端慢?
- 没找到"/usr/local/java/java1.2.2"
- 数据库标志位字段用CHAR(2)还是INT的困惑?
"而是查找索引表",我的问题是,你在索引表中查找mike时,那索引表本身中不也是有1000个项的,不也是在1000条中找一个值。 不知道我这句本身说的对还是错?
普通表的结构是堆,必须遍历才能找到想要的记录.
索引的结构就像数据结构中的二叉树,不需查找每个结点,索引的结点中保存了相应的列值和ROWID,例如你找mike,会先找到
mike结点,然后根据ROWID就可以直接定位到行!