不建立索引,则会全表扫描,使用索引则直指目标数据集,可以加快检索速度。索引是以二叉树的方式存储数据,小的在左,大的在右。如要查询sal>2000的数据,则以2000为树根,其余数据按规则排列,那么只需要查询右边的树杈即可而不是全表扫描。
建立索引语句:
1 create index Stuname on student(name);
但并不是每一列都建索引就好,事实上,对于经常变更的数据不会提高反而会降低数据库查询速度,并且不利于数据维护,因此须谨慎使用。
几个面试题:
1、建立索引一定会减少查询时间吗?也就是提高查询效率 2、一个系统,你使用了一年后,系统响应突然变慢了,请分析变慢的原因 3、有一个很大的表,建立索引一般需要注意些什么,在什么字段合理?? 1.创建索引的目的是为了加速查询速度,按照b*tree索引的原理,索引树表里最后一级存储的一定是记录的唯一id, 因此我们根据索引查询时,会先去索引表中查询到符合条件的记录id,然后再根据记录id在数据表根据找到的符合条件的记录对应的block, 因为根据唯一id查询数据会迅速定位至相应的记录所在的block,不需要扫描所有的数据表的block,因此会很快速的定位到记录的信息; 但如果查询结果数据量很大(超过数据记录的85%),则因此查询索引表也需要消耗一定的时间,再加上查询数据表的时间,反而会降低根据索引查询的性能。 这也是oracle为什么在原来基于索引规则查找的基础上,增加了cbo(基于成本)查找的原因!oracle会根据提前对索引的数据记录数进行收集, 对索引的数据值创建直方图,直方图用以确定索引值对应范围在整个数据记录值占的比重;然后根据查询的值所占的所有记录的比重来计算一下是走索引还是走全表扫描. 2.影响数据库变慢的原因很多种,主要有以下几类: (1)硬件问题,cpu ,内存,磁盘等; (2)返回的结果集过大的问题; (3)db_area_size命中率过低的问题; (4)索引收集的数据不准确的问题; (5)sql使用了过多的动态sql也会影响数据查询性能;
解决思路: (1)其中硬件方面的问题, 一般都是加大内存的处理方头法; (2)而返回的结果集过大主要针对某一个或某几个sql的问题,将返回的结果集尽量的减小; (3)针对db_area_size过小的问题主要还是因为结果集过大或所有的结果集过于分散,无法在内存中长时间保存,这样的话可以增加db_area_size的大小, 可以让更多的结果集block存储在内存中,而不需要去频繁的访问磁盘读取数据; (4)索引收集的问题主要原因是由于频繁的插入、更新、删除数据后,相应的索引收集的数据可能会有大的差别,这样可能需要走索引的也走了全表扫描,或相反,这时需要对索引重新收集,生成新的直 方图,以使查询选择正常的查询路径; (5)不要过多的使用动态sql,或者说不允许使用动态sql,因为过多的动态sql,会频繁的更新shared area中的sql的解析结果和执行计划;造成需要频繁的对 sql进行解析并生成新的执行路径等; 3.在大表上创建索引时,不要在频繁进行查询的列并且返回过多结果集的列上创建索引,因为这样的索引没有意义,只会加重插入、更新、删除操作的负担; 不要在值很分散的列上创建bitmap索引,因为bitmap索引会在做更新、插入、删除操作时,锁住全表;这样对查询无意义并且会严重影响日常的操作性能。