详解数据库中主键、索引以及两者之间的区别

主键

主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键,主
键所在的列通常是整数类型。

一个可能被忽略的问题:数据库表中必须有主键吗?

答案是否定的。数据库中的表可以不要主键。

主键的作用

  1. 保证实体的完整性;
  2. 加快数据库的操作速度
  3. 在表中添加新记录时,数据库会自动检查新记录的主键值,不允许该值与其他记录的主键值重复。
  4.  数据库自动按主键值的顺序显示表中的记录。如果没有定义主键,则按输入记录的顺序显示表中的记录。

主键的特点

  • 一张表只能有一个主键,如果其他字段定义为主键,那么原来设定为主键的字段就会取消。
  • 主键的值不能重复,也不能为空。

下面来回答是否必须建立主键的问题,这需要从以下两方面考虑:

1.是否满足业务要求

2.数据查询效率,主键可以提高查询效率,当然合理的索引替代也可以,主要看表的功能,如果是用来存储大量数据,并需要经常查询这个表的,建立主键可以加快查询效率从而降低服务器的负担,如无此需求,则不需要,建立反而会占用服务器的资源。

索引

什么是索引?

索引是一种特殊的文件,文件中包含着对数据表里所有记录的引用指针。同时索引是一种数据结构。数据库索引是数据库管理系统中一个排序的数据结构,用来协助快速的查询、更新数据表中的数据。索引的实现通常是B+树。

更通俗的说,索引就相当于目录,为了更方便的找到书中的内容,我们通常先在书前面的目录中查找,通过对内容建立索引形成目录。索引是一个文件,需要占用额外的物理空间。

从定义可以总结出索引的优缺点:

索引的优点:

  • 大大加快数据的检索,这也是创建索引最主要的原因和初衷。
  • 通过使用索引,提高整体的系统性能。

索引的缺点:

  • 时间方面:创建索引和维护索引要耗费时间。因为当对表中的数据进行增加、删除、修改的时候,索引也要动态的维护,从而就会降低增删改的执行效率。
  • 空间方面:索引需要占用物理空间。

索引的类型

主键索引:数据列不允许重复,不允许为NULL,一个表只能有一个主键。

唯一索引:数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引

  • 通过alter table 表名 add unique(列名);创建唯一索引
  • 通过alter table 表名 add unique(列名1,列名2);创建唯一组合索引

普通索引:基本的索引类型,没有唯一性的限制,允许为NULL值。

  • 通过alter table 表名 add index 索引名(列名);创建普通索引
  • 通过alter table 表名 add index 索引名(列名1,列名2,列名3);创建组合索引

全文索引:当对文章字段或有大量文字的字段进行检索时,会使用到全文索引。

  • 通过alter table 表名 add fulltext(列名);创建全文索引

索引的数据结构

索引的数据结构和具体存储引擎的实现有关,在MySQL中使用较多的索引有Hash索引、B+树索引等。我们经常使用的InnoDB存储引擎的默认索引实现为B+树索引。Hash索引,其底层的数据结构就是哈希表,因此在绝大多数需要为单条记录查询的时候,可以选择哈希索引,查询速度最快,其余大部分场景选择B+树索引。

B+树索引

  • 所有关键字都出现在叶子节点的链表中(稠密索引),且链表中的节点都是有序的。
  • 不可能在非叶子节点命中。
  • 非叶子节点相当于是叶子节点的索引(稀疏索引),叶子节点相当于存储数据的数据层。
  • 更适合文件索引系统

哈希索引

哈希索引类似于数据结构中简单实现的散列表,当我们在mysql中用哈希索引时,主要就是通过hash算法(常见的有直接定制法、平方取中法、折叠法、除数取余法、随机数法),将数据库字段数据转换成定长的hash值,与这条数据的行指针一起存入hash表的对应位置,如果发生哈希冲突,即两个不同关键字的hash值相同,则在对应的hash键下以链表的形式存储。

索引的基本原理

索引用来快速地寻找那些具有特定值的记录,如果没有索引,一般来说执行查询时遍历整张表。

索引的原理就是把无序的数据变成有序的查询。

  1. 把创建了索引的列的内容进行排序
  2. 对排序结果生成倒排表(倒排索引:由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引)
  3. 在倒排表内容上拼上数据地址链
  4. 在查询的时候,先拿到倒排表的内容,再取出数据地址链,从而拿到具体数据。

主键与索引的区别

  • 主键是为了标识数据库记录唯一性,不允许记录重复,且键值不能为空,主键也是一个特殊索引.
  • 数据表中只允许有一个主键,但是可以有多个索引.
  • 使用主键会数据库会自动创建主索引,也可以在非主键上创建索引,方便查询效率.
  • 索引可以提高查询速度,它就相当于字典的目录,可以通过它很快查询到想要的结果,而不需要进行全表扫描.
  • 除了主键索引外索引的值可以为空. 
  • 主键也可以由多个字段组成,组成复合主键,同时主键肯定也是唯一索引.
  • 唯一索引则表示该索引值唯一,可以由一个或几个字段组成,一个表可以有多个唯一索引.

 

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值