zoukankan      html  css  js  c++  java
  • 索引

    一、什么是索引?

    索引就是为了提高查询速度而对某些字段中的值建立的目录 。

    索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。

    二、为什么要索引?

    如果要在表中查询指定的记录,在没有索引的情况下,必须遍历整个表,而有了索引之后,只需要在索引中找到符合查询条件的索引字段值,就可以通过保存在索引中的rowid快速找到表中对应的记录。

    例如:如果将表看做一本书,索引的作用则类似于书中的目录。在没有目录的情况下,要在书中查找指定的内容必须阅读全书,而有了目录之后,只需要通过目录就可以快速找到包含所需内容的页码(相当于rowid),rowid就相当于书的页码。

    例如这样一个查询:

    select  *  from  table  where  id=10000。如果没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),即可在索引中查找。由于索引是经过某种算法优化过的,因而查找次数要少的多。

    三 建立索引的过程

    在创建索引时,oracle首先对将要建立索引的字段进行排序,然后将排序后的字段值和对应记录的rowid存储在索引段中。

    四、创建索引的目的

    建立索引的目的是加快对表中记录的查找或排序的速度。

    五、创建索引的好处

    创建索引可以大大提高系统的性能。

    1、帮助用户提高查询速度 

    2、利用索引的唯一性来控制记录的唯一性 

    3、可以加速表与表之间的连接 

    4、降低查询中分组和排序的时间 

    六、创建索引的坏处

    增加索引也有许多不利的方面。

    1、创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。

    2、存储索引占用磁盘空间

    3、当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

    七、注意事项

    索引是建立在数据库表中的某些列的上面。在创建索引的时候,应该考虑在哪些列上可以创建索引,在哪些列上不能创建索引。

    一般来说,应该在这些列上创建索引

    1、在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度;

    2、在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快数据排序速度;

    3、为了提高多表连接的性能,应该在连接列上建立索引;

    4、建议将表和索引部署到不同的表空间,这样可以提高访问性能

    5、限制表的索引个数。索引主要用于加快查询速度,但是会降低DML操作的速度。索引越多,DML操作速度越慢,尤其会极大的影响insert和delete操作的速度。因此,在规划索引时,必须仔细权衡查询和DML的需求。

    6、不要在小表上建立索引

      7、对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如学生表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。

    8、对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。

    9、在oracle中,系统会自动为表的主键列创建索引,默认是普通的B树索引。

    八、 索引的种类

    按照索引数据的存储方式可以分为

    1、 B树索引

    2、 位图索引

    3、 反向键索引

    4、 基于函数的索引

    按照索引列的唯一性分为唯一索引和非唯一索引

    按照索引列的个数可以分为单列索引和复合索引

    聚集索引和非聚集索引

    聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致。聚集索引和非聚集索引都采用了B+树的结构

    聚集索引:表中记录的排列顺序与索引的排列顺序一致,

    适用于:查询的结果返回一个区间的值;

    非聚集索引:指定了表中记录的逻辑顺序,但记录的物理顺序和索引的顺序不一致,

  • 相关阅读:
    Selenium 面试题总结
    springbatch 给自定义的processor传递JobParameters中设置的参数
    spring batch 相关的九张表的初始化脚本
    springbatch 读取csv文件时 文件中有字符串需要转换为Date类型的字段报错字符串不能转化为Date类型的解决方法
    spring+quartz定时任务配置---MethodInvokingJobDetailFactoryBean
    springmvc+mybatis+html 下将查询数据以excell形式上传到ftp(下)
    springmvc+mybatis+html 下将查询数据以excell形式上传到ftp(上)
    入门 ARM 汇编(二)—— 寻址方式
    系统进程 zygote(二)—— zygote.rc 脚本
    系统进程 zygote(一)—— 概述
  • 原文地址:https://www.cnblogs.com/elikun/p/10104377.html
Copyright © 2011-2022 走看看