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

    注:本文大部分内容为网络资料的转载,我对其进行了整理与总结。如果出处不可考则未标明出处。


    一、啥叫索引?

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

    说白了,索引就是一种能够在数据库查询中,加快查询速度的工具。使用索引需要使用特定的数据结构,来提高查询效率。

    二、索引有啥?

    前面提到,索引需要采用特定的数据结构来提高查询效率,那么究竟采用了哪些数据结构,又是如何提高查询效率的呢?

    索引分按存储方式分为:聚簇索引非聚簇索引

    • 聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引不是;
    • 聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。

    根据数据库的功能,可以在数据库设计器中创建三种索引:唯一索引主键索引聚集索引
    注:其中聚集索引就是聚簇索引

    三、各种索引都是啥?

    1、唯一索引

    唯一索引是不允许其中任何两行具有相同索引值的索引。

    当现有数据中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一起保存。数据库还可能防止添加将在表中创建重复键值的新数据。

    2、主键索引

    数据库表经常有一列或多列组合,其值唯一标识表中的每一行。该列称为表的主键。

    在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。

    注:在部分数据库中(如mySql),主键索引默认采用聚簇索引

    3、聚集索引 (聚簇索引)

    在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。

    关于聚簇索引与非聚簇索引的详细内容,请参看:https://blog.csdn.net/qq_32623363/article/details/87930479

    四、索引采用的数据结构都有啥?

    SQL的主流索引结构有B+树以及Hash结构,现在使用B+数结构的居多。

    有关B树索引的相关用法及原理,请参看:https://blog.csdn.net/qq_32623363/article/details/87929187

    五、使用索引的优缺点

    优点:

    • 第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
    • 第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
    • 第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
    • 第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
    • 第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

    缺点:

    • 第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
    • 第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
    • 第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

    六、使用索引的正确姿势

    1、表的主键、外键必须有索引;
    2、数据量超过300的表应该有索引;
    3、经常与其他表进行连接的表,在连接字段上应该建立索引;
    4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
    5、索引应该建在选择性高的字段上;
    6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
    7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:

    每建立一个索引,实际上都需要在硬盘上开辟一块空间用于存储这个索引所需要的数据结构(虽然表述不太准确但是是这个意思),因此不建议对太长的字段建立索引。
    而且建立的索引并不是越多越好,因为索引虽然能够提高查询效率,但是会大大得影响插入、删除和修改的效率,因为每一次数据的更新都会牵涉到对索引的修改。

    综上所述,往往在对于大量数据的插入的情况的时候,我们需要先删除掉数据表的索引,等插入完毕后重新建立索引,这样才能最大限度地保证数据库的效率。

  • 相关阅读:
    页面布局
    序列化和反序列化
    虚方法、抽象类
    方法的重载 、重写
    C#委托与事件
    C#中的反射
    SQL用法
    Ubuntu:Unable to locate package ***
    Django 使用mysql 所遇到问题一:Error loading MySQLdb module
    python collection 中的队列
  • 原文地址:https://www.cnblogs.com/yinyoupoet/p/13287433.html
Copyright © 2011-2022 走看看