【后端面经】MySQL主键、唯一索引、联合索引的区别和作用
0. 简介
索引是一类特殊的文件,用来存储检索信息,使数据库查找更加快速。
1. 主键
主键是一类特殊的唯一索引,选择某一列元素作为主键,用来表示每一行元素的特殊性,其特点如下
- 在一个数据表中只有一个主键;
- 主键不能为空(null);
- 主键的列数据不能重复(唯一索引的特点)。
2. 唯一索引
唯一索引是数据库中的一个索引类型,用来保证某列元素的数据唯一性,其特点如下:
- 一个数据表中可以有多个唯一索引;
- 唯一索引可以为空(null);
- 唯一索引的列数据不能重复。
3. 联合索引
当一个索引由多个列组成时,称为联合索引,主要用于快速查找某一特殊元素,其特点如下:
- 列顺序很重要:ABC和CBA是两类不同的联合索引;
- 一个数据表中可以有多个联合索引。
4. 索引对数据库操作的影响
索引的使用目的是为了加快查找数据的速度。
- 读(查找数据)
通过检索索引文件而不是整个数据库文件,能够加快读数据的速度。 - 写(更新数据、增删改)
索引文件是独立于数据文件的,因此在写数据的时候,需要同时更新索引文件和数据文件,因此会降低写数据的速度。
5. 其他索引
5.1 普通索引
和一般索引相比,允许列数据重复,作用是加快数据访问速度。特点如下:
- 一个数据表中可以有多个唯一索引;
- 普通索引可以为空(null);
- 普通索引的列数据能重复。
5.2 全文索引
用来加快对大文本数据关键字的检索,MySQL5.6之后InnoDB也支持该索引。
5.3 前缀索引
仅针对字符串类型的数据,只索引字符串的前几个字符,而不是整个字符串。因此索引文件更小。
6. 总结
对上述的几种索引的特点对比如下所示:

7. 参考资料
【后端面经】MySQL主键、唯一索引、联合索引的区别和作用的更多相关文章
- Mysql主键索引、唯一索引、普通索引、全文索引、组合索引的区别
原文:Mysql主键索引.唯一索引.普通索引.全文索引.组合索引的区别 Mysql索引概念: 说说Mysql索引,看到一个很少比如:索引就好比一本书的目录,它会让你更快的找到内容,显然目录(索引)并不 ...
- mysql主键,外键,索引
主键 唯一而非空,只能有一个 作用: 1.唯一的标识一行 2.作为一个可以被外键有效引用的对象 3.保证数据完整性 设计原则: 1. 主键应当是对用户没有意义的.如果用户看到了一个表示多对多关系的 ...
- MySQL主键和索引的联系及区别
转载自:http://www.nowamagic.net/librarys/veda/detail/1954 关系数据库依赖于主键,它是数据库物理模式的基石.主键在物理层面上只有两个用途: 惟一地标识 ...
- MySQL主键与索引的区别和联系
MySQL主键与索引的区别和联系 关系数据库依赖于主键,它是数据库物理模式的基石.主键在物理层面上只有两个用途: 惟一地标识一行. 作为一个可以被外键有效引用的对象. 索引是一种特殊的文件(Inn ...
- MySQL主键设计
[TOC] 在项目过程中遇到一个看似极为基础的问题,但是在深入思考后还是引出了不少问题,觉得有必要把这一学习过程进行记录. MySQL主键设计原则 MySQL主键应当是对用户没有意义的. MySQL主 ...
- MYSQL主键自动增加的配置及auto_increment注意事项
文章一 原文地址: http://ej38.com/showinfo/mysql-202971.html 文章二: 点击转入第二篇文章 在数据库应用,我们经常要用到唯一编号.在MySQL中可通过字 ...
- mysql主键问题
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_22314145/article/details/80824660 MySQL主键 一. MyS ...
- 【SqlServer】聚集索引与主键、非聚集索引
目录结构: contents structure [-] 聚集索引和非聚集索引的区别 聚集索引和主键的区别 主键和(非)聚集索引的常规操作 聚集索引.非聚集索引在SqlServer.MySQL.Ora ...
- MySQL主键设计盘点
目录 主键定义 主键设计和应用原则 主键生成策略 自增ID UUID 自建的id生成器 Twitter的snowflake算法 @ 最近在项目中用了UUID的方式生成主键,一开始只是想把这种UUID的 ...
- mybatis框架(6)---mybatis插入数据后获取自增主键
mybatis插入数据后获取自增主键 首先理解这就话的意思:就是在往数据库表中插入一条数据的同时,返回该条数据在数据库表中的自增主键值. 有什么用呢,举个例子: 你编辑一条新闻,同时需要给该新闻打上标 ...
随机推荐
- vue中使用vue.extend在dom挂载vue实例
const CounterComponent = Vue.extend(Counter); this.vm = new CounterComponent({}).$mount('#container' ...
- STM32 HAL库学习(F407ZGT6) (1)-晶振/时钟树
时钟树(以F407为例) 对于 STM32F4 系列的芯片,正常工作的主频可以达到 168Mhz,但并不是所有外设都需要系统时钟这么高的频率,比如看门狗以及RTC只需要几十Khz的时钟即可.同一个 ...
- CPU内部的奥秘:代码是如何被执行的?
我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:景明 我们以一段 C 代码为例,来看一下代码被编译成二进制 ...
- JS - new Function
Function 在JavaScript当中,除了可以使用function或箭头函数定义方法外,还可以使用new Function的形式动态创建函数,此时与eval()方法类似 创建一个不接收参数的方 ...
- Oracle问题:ORA-01565
问题 oracle启动时报错,找不到spfile文件. ORA-01078: failure in processing system parameters ORA-01565: error in i ...
- pandas之reindex重置索引
重置索引(reindex)可以更改原 DataFrame 的行标签或列标签,并使更改后的行.列标签与 DataFrame 中的数据逐一匹配.通过重置索引操作,您可以完成对现有数据的重新排序.如果重置的 ...
- 逍遥自在学C语言 | 位运算符^的高级用法
前言 在上一篇文章中,我们介绍了|运算符的高级用法,本篇文章,我们将介绍^ 运算符的一些高级用法. 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一 ...
- 虚拟内存与malloc/new原理详解
malloc malloc()函数并不是系统调用,而是 C 库里的函数,用于动态分配内存.malloc() 分配的是虚拟内存,而不是物理内存.如果分配后的虚拟内存没有被访问的话,是不会将虚拟内存映射到 ...
- 信息论之从熵、惊奇到交叉熵、KL散度和互信息
一.熵(PRML) 考虑将A地观测的一个随机变量x,编码后传输到B地. 这个随机变量有8种可能的状态,每个状态都是等可能的.为了把x的值传给接收者,需要传输⼀个3⽐特的消息.注意,这个变量的熵由下式给 ...
- vue3+vant创建移动端项目,实战项目常见采坑记录
前言: 产品背景介绍 我所做的这个项目,刚开始是没有移动端需求的,等PC端做完了上线使用了几个月后,突然有一天产品经理找到我说是要做一个在PC端添加一个快速注册入口,用手机微信扫二位码进入移动端注册页 ...