数据库条有过程中经常涉及一个概念就是索引。接下来我就来讲讲我理解的索引
首先,数据库中的数据是存储在一个个实实在在的在硬盘上的文件中,oracle最小的文件操作单位叫数据块。所谓的查询就是从这些文件中找到我们想要的数据。
例如用下面语句就可以知道员工名字叫king的员工信息数据具体存在哪里。
select e.rowid,
(select file_name
from dba_data_files where file_id =
dbms_rowid.rowid_to_absolute_fno(e.rowid,'SCOTT','EMP')) FILEN,
dbms_rowid.rowid_block_number(e.rowid) block_no,
dbms_rowid.rowid_row_number(e.rowid) row_no
from emp e
where e.ename='KING'
.dbf就是数据库存储数据用的文件后缀。和.doc什么的是一个概念,只不过内部数据组织方式不一样而已。
既然知道了数据时存在硬盘上的,那么我们知道,计算机是无法对硬盘上数据进行操作的。必须要将数据加载到内存中才能操作。那么oracle怎么做呢。
1.如果没有索引,那么oracle就把要查询表拥有的的所有数据块拿到内存中来,再根据条件筛选到需要的数据行,这样显然有很多浪费。
2.如果有索引,那么oracle就根据索引取数据行所在的数据块,这样就减少了很多不必要的IO节省时间,提高效率。
索引和数据文件的关系如下。
1.索引也是真实存在的文件和数据文件是分开的,所以建索引是会消耗存储空间的。
2.索引里面叶子节点存储了rowid(可以根据rowid找到数据块和数据行,见第一个查询)
3.索引结构中根节点只有一个里面根据列值范围不同分别指向不同的子节点,子节点也根据列值范围不同分别指向叶子节点,叶子节点根据rowid找到真实存储数据的数据块。
举例说明索引查找的过程。例如要找一个年龄为15岁的人,那么如果在年龄字段上有索引,那么数据库首先取root节点,假设节点1中年龄段为1-20.节点2为21-40.那么数据库根据root节点的信息读入节点1到内存,假设每个叶子节点1存储了年龄为1岁的,以此类推叶子节点15存储了年龄为15速的。那么根据节点一中的信息数据库将叶子节点15读入内存。拿到叶子节点15中存储的rowid。根据rowid就可以到数据文件中找到真实数据。
索引和费索引的工作原理就差不多如上所述。
总结一下
1.因为索引占存储空间,所以在一个表上所有列建立索引是不明智的。经验值为最多五列
2.上面也解释了为什么有时候数据库不走索引而进行全表扫描。如果你要取的数据很分散且比较多。那么走索引除了要取出真实数据块还要取索引块,因此消耗更大,那么什么情况下走全表更加高效呢,就目前而言我只能说影响因素有你要取的数据占总量的百分比和数据存储的集中度。
3.想要进一步了解索引可以参考学习一下B-TREE结构,这样你就能理解为什么索引会影响插入,删除效率了。