PRIMARY KEY & UNIQUE(主键、唯一索引)

本文深入解析了MySQL中的主键和唯一索引,包括它们的概念、分类和作用。介绍了索引的B-Tree和Hash数据结构,强调了主键的重要性以及创建索引的优缺点。同时,针对何时创建索引提出了实用建议,并列举了不应创建索引的情况,以优化数据库性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里是修真院后端小课堂,每篇分享文从

【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】

八个方面深度解析后端知识/技能,本篇分享的是:

1.背景介绍

概念

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。

MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。

不建立索引的话,MySQL执行查询会从数据表的第一行开始查直到查询想要的数据结果。
2.知识剖析

索引的分类–单列来区分

1).普通索引–这是最基本的索引,它没有任何限制

2).唯一索引–索引列的值必须唯一,但允许有空值;如果是组合索引,则列值的组合必须唯一

3).主键索引–列值唯一,非空,一个数据表只能有一个主键

4).组合索引:将数据表中多个列建到一个索引中,MySQL组合索引遵循“最左前缀”原则,

就是说你的查询条件语句里必选包含组合索引第列的值才能使用

改组合索引,例如在某个数据表中为user,name,age三个列建立组合索引,

查询语句里必须有where user*才会调用这个索引。

索引的分类(存储结构)(InnoDB)

B-tree

mysql数据库中主键、唯一、普通、全文都是采用b-tree数据结构

在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,

这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,

因此InnoDB表数据文件本身就是主索引,InooDB必须要求主键,没有显示声明,系统会默认添加

除了主键索,其它都是辅助索引,辅助索引也会包含主键列,因此主键列最好不要设置太大的列值

因为是聚簇索引方式,聚簇索引的顺序就是数据的物理存储顺序,叶节点就是数据节点。主键最好是单调的。

hash索引

简单地说,哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快

1.可以通过建立唯一索引或者主键索引,保证数据库表中每一行数据的唯一性.

2.建立索引可以大大提高检索的数据,以及减少表的检索行数

3.在表连接的连接条件 可以加速表与表直接的相连

4.在分组和排序字句进行数据检索,可以减少查询时间中 分组 和 排序时所消耗的时间(数据库的记录会重新排序)

5.建立索引,在查询中使用索引 可以提高性能
3.常见问题

1.索引可以提高查询效率,数据表每个列都建索引,这样可行吗?

1).在创建索引和维护索引 会耗费时间,随着数据量的增加而增加

2).索引文件会占用物理空间,除了数据表需要占用物理空间之外,每一个索引还会占用一定的物理空间

3).当对表的数据进行INSERT,UPDATE,DELETE的时候,索引也要动态的维护,这样就会降低数据的维护速度,(建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快)。
4.解决方案

1.在经常需要搜索的列上,可以加快索引的速度

2.主键列上可以确保列的唯一

3.在经常需要排序(order by),分组(group by)和的distinct列上加索引 可以加快排序查询的时间

4.在一些where之后的< <= > >= BETWEEN IN以及某个情况下的like建立字段的索引(B-TREE)

5.选择越小的数据类型越好,因为通常越小的数据类型通常在磁盘,内存,cpu,缓存中 占用的空间很少,处理起来更快
5.什么情况不要建索引?

1.查询中很少使用到的列 不应该创建索引,如果建立了索引然而还会降低mysql的性能和增大了空间需求.

2.很少数据的列也不应该建立索引,比如 一个性别字段0或者1,在查询中,结果集的数据占了表中数据行的比例比较大,mysql需要扫描的行数很多,增加索引,并不能提高效率

3.当表的修改(UPDATE,INSERT,DELETE)操作远远大于检索(SELECT)操作时不应该创建索引,这两个操作是互斥的关系

### 数据库中主键唯一索引、外键和超键的概念及用法 #### 主键 (Primary Key) 主键是能够唯一标识表中某一行的属性属性组。一个表只能有一个主键,但可以有多个候选索引[^3]。由于主键具有唯一性和非空性的特点,因此它可以在执行数据更新、删除操作时确保不会发生误操作。此外,主键通常与其他表中的外键一起工作,形成参照完整性约束,从而防止数据不一致的情况。 例如,在学生表 `(学号, 姓名, 性别, 班级)` 中,`学号` 是唯一的,因此 `学号` 可以作为主键;而在成绩表 `(学号, 课程号, 成绩)` 中,单独的一个属性无法唯一标识一条记录,只有当 `学号` 和 `课程号` 的组合才能唯一标识一条记录,因此这两个字段共同构成了复合主键[^4]。 ```sql CREATE TABLE Students ( StudentID INT PRIMARY KEY, Name VARCHAR(100), Gender CHAR(1), Class VARCHAR(50) ); ``` #### 唯一索引 (Unique Index) 唯一索引是一种特殊的索引类型,它可以确保列中的所有值都是唯一的。虽然唯一索引并不强制要求不能为空,但如果设置了唯一索引的列为允许为空,则该列最多只有一行可以包含 NULL 值。创建唯一索引的主要目的是提高查询效率并保证数据的唯一性。 ```sql CREATE UNIQUE INDEX idx_student_name ON Students(Name); ``` #### 外键 (Foreign Key) 外键用于与另一个表建立关联关系。具体来说,如果 A 表中的某个字段对应于 B 表的主键,则此字段称为 A 表的外键。通过这种方式,两个表之间形成了逻辑上的连接,有助于维持数据的一致性和完整性。例如,在成绩表中,`学号` 不仅是本表的一部分,还指向了学生表中的相应记录,即 `学号` 同时也是学生表的外键。 ```sql ALTER TABLE Scores ADD CONSTRAINT fk_student_id FOREIGN KEY (StudentID) REFERENCES Students(StudentID); ``` #### 超键 (Super Key) 超键是指能够在一定范围内唯一识别实体实例的一组属性集合。换句话说,只要一组属性足以区分不同记录之间的差异,那么这组属性就构成了一个超键。值得注意的是,任何超键都可以进一步精炼成更小规模但仍具备相同功能的新超键&mdash;&mdash;直到最终得到最小化的超键,也就是我们所说的 **候选键** 者直接成为主键之一[^2]。 ```sql -- 这里展示了一个简单的例子来说明如何理解超键 SELECT * FROM Employees WHERE Department = &#39;Sales&#39; AND Position = &#39;Manager&#39;; -- 如果以上条件组合能唯一确定员工,则 {Department, Position} 就是一个超键 ``` ### 区别 - **主键 vs. 唯一索引**: 主键不仅限定了唯一性而且还规定了不可为空;而唯一索引则不一定如此。 - **主键 vs. 外键**: 主键用来唯一标识当前表内的每一行记录;外键则是为了实现跨表间的数据引用和一致性控制。 - **超键 vs. 主键/候选键**: 所有的主键者候选键本质上都是经过优化后的最小子集形式的超键。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值