索引和表是独立的对象
索引和表是独立的对象,它们分别拥有自己的存储空间,并不是放在一起的,所以它们可以存放在不同的表空间(每个表空间是一组数据文件的集合)中。一个表上如果有多个索引,那每个索引也是独立的对象,拥有自己的存储空间。两个索引之间是没有关系,好比字典的拼音索引和部首索引,在编排和使用时都是相互独立的 。
索引和表在磁盘上的存放方式
表和索引的数据都存放在磁盘的数据块中,每个数据块一般固定为8K。数据块是数据读写的小单位,即使只需要读取一条数据,也会把整块的数据读到内存中,写数据也一样。表中的数据是无序的存放在数据库块中的,两个数据块完全没有关系,同一个数据块中的数据也没有关系。数据在表中的顺序也不一定是录入的顺序,后录入的数据可能在前面。如果想从表中查询某条数据,在没有索引的情况下就只能扫描表的所有数据块了,即全表扫描。这就好比一本书没有目录,要找某个内容只能把整本书翻一遍。与表的无序存放不同,索引是有序存放的。在存放索引的数据块上,数据都是有序的,并且数据块之间使用指针进行关联。
索引和表之间是如何关联的
索引中保存:索引的键值(索引列的值);数据在表中的地址(rowid)。查字典时,根据拼音索引可以找到某个字的页码然后直接到该页查看详细内容。Oracle索引与查字典也很类似,如果要找userid=10的数据,那么就到userid索引中先找到目标数据的地址(rowid),然后根据数据地址到表中查看目标数据的详情。那么,如果要找username=’abc’的数据呢,userid的索引就不好用了,需要使用username的索引了。这就好比你只知道汉字的写法就不能使用拼音检索,而只能用部首查字法了