索引的基本概念
索引是一种特殊类型的数据库对象,它与表有着密切的联系。
索引是为检索而存在的。如一些书籍的末尾就专门附有索引,指明了某个关键字在正文中的出现的页码位置,方便我们查找,但大多数的书籍只有目录,目录不是索引,只是书中内容的排序,并不提供真正的检索功能。可见建立索引要单独占用空间;索引也并不是必须要建立的,它们只是为更好、更快的检索和定位关键字而存在。
再进一步说,我们要在图书馆中查阅图书,该怎么办呢?图书馆的前台有很多叫做索引卡片柜的小柜子,里面分了若干的类别供我们检索图书,比如你可以用书名的笔画顺序或者拼音顺序作为查找的依据,你还可以从作者名的笔画顺序或拼音顺序去查询想要的图书,反正有许多检索方式,但有一点很明白,书库中的书并没有按照这些卡片柜中的顺序排列——虽然理论上可以这样做,事实上,所有图书的脊背上都人工的粘贴了一个特定的编号①,它们是以这个顺序在排列。索引卡片中并没有指明这本书摆放在书库中的第几个书架的第几本,仅仅指明了这个特定的编号。管理员则根据这一编号将请求的图书返回到读者手中。这是很形象的例子。
索引分类:聚集索引和非聚集索引 (注意:聚集索引会改变记录的物理位置)
从形式上而言,索引分为聚集索引(Clustered Indexes)和非聚集索引(NonClustered Indexes)。
聚集索引---相当于书籍脊背上那个特定的编号。如果对一张表建立了聚集索引,其索引页中就包含着建立索引的列的值(下称索引键值),那么表中的记录将按照该索引键值进行排序。比如,我们如果在“姓名”这一字段上建立了聚集索引,则表中的记录将按照姓名进行排列;如果建立了聚集索引的列是数值类型的,那么记录将按照该键值的数值大小来进行排列。
非聚集索引----用于指定数据的逻辑顺序,也就是说,表中的数据并没有按照索引键值指定的顺序排列,而仍然按照插入记录时的顺序存放。其索引页中包含着索引键值和它所指向该行记录在数据页中的物理位置,叫做行定位符(RID:Row ID)。好似书后面的的索引表,索引表中的顺序与实际的页码顺序也是不一致的。而且一本书也许有多个索引。比如主题索引和作者索引。
索引优点和不足
索引缺点:1:建立索引,系统要占用大约为表的1.2倍的硬盘和内存空间来保存索引。2:更新数据的时候,系统必须要有额外的时间来同时对索引进行更新,以维持数据和索引的一致性——这就如同图书馆要有专门的位置来摆放索引柜,并且每当库存图书发生变化时都需要有人将索引卡片重整以保持索引与库存的一致。
索引优点:在海量数据的情况下,如果合理的建立了索引,则会大大加强SQLS执行查询、对结果进行排序、分组的操作效率。
当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度
建立索引时一定要在“加快查询速度”与“降低修改速度”之间做好平衡,有得必有失,此消则彼长。
例:
select * from student的时候,内部会进行一次对 表student全表扫描。
比如b列代表的是 学生姓名
select * from student where b='张三' 此时oracle内部会对 属于student表名为aindex的索引进行扫描。
如果该表有上百万的数据,则该查询效果会十分明显。
在执行完 create index aindex on student(b);
oracle 自动创建一张索引表 里面的字段有 索引列b和rowid;就好比是书的目录,有章节和页码一样。这也就是为什么索引可以提高查询速度的原因了。
说白了 索引只是用于优化where后面的条件查询,但注意的是 不是索引越多越好,where后面使用到的索引列套用了函数的话 是不会只用到索引的,创建索引的列也不是那么随便的。
ROWID是表中行的唯一标识,是一个伪列.
“索引表会根据索引列的值进行排序” 这个不一定。如果你批量插入数据,B列有10,20,30,40,50,60,70 可能现在的索引表中的索引列是按照顺序的,但之后你又插入了个12,那么这行数据插入到表中后,也会插入到索引列的“最后”,这里的最后为什么用引号引起来,因为这个问题就会涉及到数据块存储方面的了。
其实最简单 最形象的 就是书的目录页码就是rowid 可能你的目录是
索引列.................. rowid
第一章..................12
第二章..................8
第三章..................5
第四章..................3