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

    索引:

    在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构。

    优点

    1.大大加快数据的检索速度;

    2.创建唯一性索引,保证数据库表中每一行数据的唯一性;

    3.加速表和表之间的连接;

    4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。

    缺点

    1.索引需要占物理空间。

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

    索引类型

    根据数据库的功能,可以在数据库设计器中创建四种索引:普通索引、唯一索引、主键索引和聚集索引

    主键索引

    简称为主索引,数据库表中一列或列组合(字段)的值唯一标识表中的每一行。该列称为表的主键。

    聚集索引

    也称为聚簇索引,在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。

    候选索引

    与主索引一样要求字段值的唯一性,并决定了处理记录的顺序。

    聚集索引通常提供更快的数据访问速度。聚集索引更适用于对很少对基表进行增删改操作的情况。

    非聚集索引

    也叫非簇索引,在非聚集索引中,数据库表中记录的物理顺序与索引顺序可以不相同。

    SQL语句:

    创建索引,例如CREATE INDEX <索引的名字> ON tablename (列的列表);

    修改表,例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表); [3] 

    创建表的时候指定索引,例如CREATE TABLE tablename ( [...], INDEX [索引的名字] (列的列表) );

    CREATE INDEX item_name_index ON trwtctest1 (ITEM_NAME)

    UNIQUE——建立唯一索引。

    CLUSTERED——建立聚集索引。

    NONCLUSTERED——建立非聚集索引。

    根据表名,查询一张表的索引:select * from user_indexes where table_name=upper('表名')

    根据索引号,查询表索引字段:select * from user_ind_columns where index_name=('索引名')

     删除索引

    当某个时期基本表中数据更新频繁或者某个索引不在需要时,需要删除部分索引。SQL语言使用DROP INDEX 语句删除索引,其一般格式是:

    DROP INDEX<索引名>

    修改索引

    对于已经建立的索引,如果需要对其重新命名,可以使用ALTER INDEX 语句。其一般格式为

    ALTER INDEX <旧引索名字> RENAME TO<新引索名>

    复合索引

    用户可以在多个列上建立索引,这种索引叫做复合索引(组合索引);     复合索引在数据库操作期间所需的开销更小,可以代替多个单一索引;     同时有两个概念叫做窄索引和宽索引,窄索引是指索引列为1-2列的索引,宽索引也就是索引列超过2列的索引;     设计索引的一个重要原则就是能用窄索引不用宽索引,因为窄索引往往比组合索引更有效;

     

    创建索引     create index idx1 on table1(col1,col2,col3)      查询     select * from table1 where col1= A and col2= B and col3 = C     这时候查询优化器,不在扫描表了,而是直接的从索引中拿数据,因为索引中有这些数据,这叫覆盖式查询,这样的查询速度非常快;  

     

     

    对于复合索引,在查询使用时,最好将条件顺序按找索引的顺序,这样效率最高;     select * from table1 where col1=A AND col2=B AND col3=D     如果使用 where col2=B AND col1=A 或者 where col2=B 将不会使用索引

     

    根据where条件建索引是极其重要的一个原则;     注意不要过多用索引,否则对表更新的效率有很大的影响,因为在操作表的时候要化大量时间花在创建索引中

     

     

    如果从表中删除了某列,则索引会受到影响。对于多列组合的索引,如果删除其中的某列,则该列也会从索引中删除。如果删除组成索引的所有列,则整个索引将被删除。

    索引适用场景

     1、索引应该经常建在Where 子句经常用到的列上。如果某个大表经常使用某个字段进行查询,并且检索行数小于总表行数的5%。则应该考虑。

     2、对于两表连接的字段,应该建立索引。如果经常在某表的一个字段进行Order By 则也经过进行索引。

     3、不应该在小表上建设索引。

     4.如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。

     5.like语句操作

    一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。

      6.不要在列上进行运算

    select * from users where

    YEAR(adddate)

     7.不使用NOT IN和or操作

     

    NOT IN和操作都不会使用索引将进行全表扫描。NOT IN可以NOT EXISTS代替,id3则可使用id>3 or id

    索引适用场景:

     1、索引应该经常建在Where 子句经常用到的列上。如果某个大表经常使用某个字段进行查询,并且检索行数小于总表行数的5%。则应该考虑。

     2、对于两表连接的字段,应该建立索引。如果经常在某表的一个字段进行Order By 则也经过进行索引。

     3、不应该在小表上建设索引。

     

    如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。

    like语句操作

    一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。

    不要在列上进行运算

    select * from users where

    YEAR(adddate)

    不使用NOT IN和操作

    NOT IN和操作都不会使用索引将进行全表扫描。NOT IN可以NOT EXISTS代替,id3则可使用id>3 or id

  • 相关阅读:
    ARM开发工具软件命令具体解释---嵌入式回归第三篇
    Java模拟公司置办货物系统(二)
    springmvc mybatis 声明式事务管理回滚失效,(checked回滚)捕捉异常,传输错误信息
    Django Drops
    从 &quot;org.apache.hadoop.security.AccessControlException:Permission denied: user=...&quot; 看Hadoop 的用户登陆认证
    iOS中Storyboard使用要点记录
    ACdream 1084 寒假安排(阶乘素因子分解)
    【死磕Java并发】-----J.U.C之AQS:CLH同步队列
    使用freemarker做邮件发送模板
    springboot 使用freemarker自定义标签
  • 原文地址:https://www.cnblogs.com/feichangnice/p/10451051.html
Copyright © 2011-2022 走看看