zoukankan      html  css  js  c++  java
  • 数据库(oracle) 索引

    定义:

    数据库索引好比是一本书前面的目录,能加快数据库的查询速度.

     

    优点:

     
    例如这样一个查询:select * from table1 where id=10000。如果没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),在索引中查找,但索引是经过某种算法优化过的,查找次数要少的多的多。可见,索引是用来定位的。
    索引分为聚簇索引非聚簇索引两种,聚簇索引 是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。

    定义:

     
    为表设置索引要付出代价的:一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
     

    优化:

    索引是建立在数据库表中的某些列的上面。在创建索引的时候,应该考虑在哪些列上可以创建索引,在哪些列上不能创建索引。一般来说,应该在这些列上创建索引
    在经常需要搜索的列上,可以加快搜索的速度;
    • 在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;
    • 在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;
    • 在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
    • 在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。
    同样,对于有些列不应该创建索引。一般来说,不应该创建索引的的这些列具有下列特点:
    • 第一,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
    • 第二,对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。
    • 第三,对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少,不利于使用索引
    • 第四,当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改操作远远多于检索操作时,不应该创建索引。

    创建索引:

    最普通的情况,是为出现在where子句的字段建一个索引。为方便讲述,先建立一个如下的表。
    CREATE TABLE mytable(
    idserial                 primary key,
    category_id          int   not null   default0,
    user_id                int   not null   default0,
    adddate               int   not null   default0
    );
    如果在查询时常用类似以下的语句:
    SELECT * FROM mytable WHERE category_id=1;
    最直接的应对之道,是为category_id建立一个简单的索引
    CREATE INDEX mytable_categoryid ON mytable (category_id);
    OK.如果有不止一个选择条件呢?例如:
    SELECT * FROM mytable WHERE category_id=1 AND user_id=2;
    第一反应可能是,再给user_id建立一个索引。不好,这不是一个最佳的方法。可以建立多重的索引
    创建多个索引:
    CREATE INDEX mytable_category id_userid ON mytable(category_id,user_id);
     
    格式:
    CREATE INDEX 索引名 ON 表名(列名)
     
    删除索引:
     
    DROP INDEX index_name [ON table_name]
     
    由于oracle中要求索引的名字为唯一的,所以当删除索引时不必指明表名。对于Microsoft Access、Microsoft SQL Server和MySQL,一个表中索引名唯一,但在不同的表中可以使用相同的索引名,因此必须指明要删除的索引的表名.
     
     
    获得已经存在的索引:
    使用 select * from user_tables 可以查询出所有的用户表
    使用 select * from user_indexes 可以查询出所有的用户表索引
     
    其他:

    1.查看所有用户

         select * from all_users;    -------查看所有的用户

         select * from user_users; --------查看当前用户

    2.查看用户或角色系统权限:

         select * from user_sys_privs; --------查看当前用户的权限

    3.查看角色所包含的权限

         select * from role_sys_privs;   -------

    4.查看用户对象权限

         select * from all_tab_privs;   --------查看所用的用户的可操作表权限
         select * from user_tab_privs; --------查看当前用户的表可操作权限

    5.查看用户或角色所拥有的角色

         select * from user_role_privs;   ------查看当前用户的角色

         select * from user_constraints where TABLE_NAME='?';    -----查看某一个表的约束

    6.查看用户下的索引

       1.  select  * from user_indexes-          -----查看当前用户下的所有索引

       2.  select  * from user_indexes where table_name='A';      -----查看当前用户下表A的索引
          (drop index index_name去掉索引) 

       3. select index_name,index_type,status,blevel from user_indexes where table_name = '?';  

               -----查看某一个表的所有索引

       4.  select table_name, index_name, column_name, column_position from        user_ind_columns where  table_name='?';    ----查看索引的构成

     7. 建索引

           create unique clustered index 索引名on 表名(字段1)  --单索引

           Create index 索引名 on 表名(字段1,字段2)  -------复合索引

     
     
     
  • 相关阅读:
    Fiddler:在PC和移动设备上抓取HTTPS数据包
    WP8:在WinRT组件(C++)中调用C#类库的解决方案
    Windows Phone 7.5/8.0/8.1 WebBrowser 渲染异常的原因及解决方法
    Xamarin.iOS开发初体验
    WP8:Unity3D之间的值传递
    【Win10 UWP】QQ SDK(一):SDK基本使用方法
    WP8.1:关于屏幕尺寸和分辨率的那些事儿
    .NET vs2010中使用IrisSkin2.dll轻松实现winForm窗体换肤功能
    记事本的编辑问题,如何删除记事本中某一列不需要的值
    C#制作RDLC报表
  • 原文地址:https://www.cnblogs.com/CBDoctor/p/2980481.html
Copyright © 2011-2022 走看看