前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >唯一索引,普通索引如何抉择

唯一索引,普通索引如何抉择

作者头像
用户7447819
发布于 2021-07-23 06:25:11
发布于 2021-07-23 06:25:11
4270
举报
文章被收录于专栏:面试指北面试指北

唯一索引,普通索引如何抉择

1. 什么是唯一索引

UNIQUE 唯一索引,不允许重复。

2. 什么是普通索引

INDEX 普通索引,允许重复。

3. 数据库查询过程中普通索引和唯一索引的区别

比如 select id from T where k=5

3.1 在k上建立普通索引

在查找的过程中,找到第一个满足 k=5的记录后,需要查询下一个记录,知道遇到第一个不满足k=5的记录。

3.2 在k上建立唯一索引

唯一索引表示索引是唯一的,因此找到第一个满足k=5的记录后,就停止查找。

3.3 对比

普通索引和唯一索引查找过程中的性能差距微乎其微,可以忽略不计。

4. 数据库更新过程中普通索引和唯一索引的区别

4.1 change buffer

  • 更新一个数据页x的时候,如果数据页x在内存里的话,就直接更新。
  • 如果数据页x不在内存里,InnoDB会将更新操作缓存在change buffer中,不需要把数据页x读到内存里
  • 下次查询访问数据页x的时候,把数据页x读入内存后,先把change buffer 中与数据页x有关操作执行,保证数据正确性。
  • change buffer 操作执行的过程为merge,除了查询操作会触发merge,后台也会定期merge。

4.2 只有普通索引的情况下才会使用change buffer

唯一索引更新的时候,需要检查唯一性约束,需要把数据页读到内存里,因此不需要change buffer。

5. 如何抉择

结论是 尽量选择普通索引。

5.1 查询的过程中

唯一索引和普通索引性能差别微乎其微。

5.2 更新的过程中

1. 要更新的数据页 在内存里
  • 普通索引,找到目标值进行更新。
  • 唯一索引,在普通索引的基础上多了一步判断冲突。
2. 要更新的数据页不在内存里
  • 唯一索引需要把数据页读到内存里,然后更新。
  • 普通索引把更新操作记录在change buffer中,稍后再执行,少了一步读取数据页到内存的操作。

6. 扩展 redo log 和 change buffer 的区别

  • redo log 节省了随机写磁盘的IO消耗,将写操作缓存下来,之后再执行。
  • change buffer 节省了 随机读磁盘的IO消耗,更新数据的时候,减少了一次读操作。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 面试指北 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
普通索引和唯一索引,应该怎么选择?
案例:假设你在维护一个市民系统,每个人都有一个唯一的身份证号,而且业务代码已经保证了不会写入两个重复的身份证号。如果市民系统需要按照身份证号查姓名,那该如何建索引?
用户7353950
2022/06/23
4340
普通索引和唯一索引,应该怎么选择?
MySQL唯一索引和普通索引
查询语句会在k索引树上的树根开始,按层搜索到叶子节点(点位到右下角的数据页),然后在数据页内部再通过二分法定位记录。
shysh95
2022/02/16
1.8K0
MySQL唯一索引和普通索引
MySQL普通索引和唯一索引的选择
假设你的项目中主要负责车辆管理系统,每辆车的车牌号在系统上唯一,在新增车辆时,业务层面会先判断待新增的车辆车牌号是否已存在系统中,产品功能中使用频率最高的是根据车牌号查询车辆信息,由于业务量和数据量的增加,现在需要考虑在车辆表车牌号字段增加索引,现有两种索引可供选择:唯一索引、普通索引。
关忆北.
2023/10/11
1900
你分得清MySQL普通索引和唯一索引了吗?
一个市民系统,每个人都有个唯一身份证号; 业务代码已保证不会写入两个重复的身份证号; 如果市民系统需要按照身份证号查姓名,就会执行类似SQL:
JavaEdge
2020/07/25
2.2K1
Mysql如何选择唯一索引和普通索引
相信大家对唯一索引和普通索引是有一定的了解的,那么在不同的业务场景,使用唯一索引还是普通索引呢,比如下面的场景
小土豆Yuki
2020/09/08
1.8K0
MySQL深入学习第九篇-普通索引和唯一索引,应该怎么选择?
在前面的基础篇文章中,我给你介绍过索引的基本概念,相信你已经了解了唯一索引和普通索引的区别。今天我们就继续来谈谈,在不同的业务场景下,应该选择普通索引,还是唯一索引?
越陌度阡
2020/11/26
9912
MySQL深入学习第九篇-普通索引和唯一索引,应该怎么选择?
MySQL 普通索引和唯一索引该如何选择?
普通索引和唯一索引在查询能力上没啥差别,主要考虑对更新性能的影响,要尽量选择普通索引。接下来分析两种索引在查询语句和更新语句对性能的影响。
王小明_HIT
2020/07/14
1.5K0
我秃了!唯一索引、普通索引我该选谁?
提到唯一索引和普通索引,相信大家都不陌生,当同事小姐姐问你这俩有什么区别时?或许你会脱口而出:“这还用问?见名知意啊,一个是允许字段重复,一个不允许存在重复数据!”
陈哈哈
2021/12/31
3040
我秃了!唯一索引、普通索引我该选谁?
普通索引和唯一索引的执行过程
我们已经介绍过索引的结构和索引的几种优化,我们再来看一下相同语句在不同索引类型的执行过程
matinal
2020/11/27
8070
选择普通索引还是唯一索引?(转)
选择普通索引还是唯一索引? 对于查询过程来说: a、普通索引,查到满足条件的第一个记录后,继续查找下一个记录,知道第一个不满足条件的记录 b、唯一索引,由于索引唯一性,查到第一个满足条件的记录后,停止检索 但是,两者的性能差距微乎其微。因为InnoDB根据数据页来读写的。 对于更新过程来说: 概念:change buffer 当需要更新一个数据页,如果数据页在内存中就直接更新,如果不在内存中,在不影响数据一致性的前提下,InnoDB会将这些更新操作缓存在change buffer中。下次查询需要访问这个数据页的时候,将数据页读入内存,然后执行change buffer中的与这个页有关的操作。
袁新栋-jeff.yuan
2020/08/26
5000
你确定分得清MySQL普通索引和唯一索引?
某居民系统,每人有唯一身份证号。如果系统需要按身份证号查姓名,就会执行类似如下SQL:
JavaEdge
2021/02/22
3K0
你确定分得清MySQL普通索引和唯一索引?
MySQL普通索引和唯一索引到底什么区别?
普通索引可重复,唯一索引和主键一样不能重复。 唯一索引可作为数据的一个合法验证手段,例如学生表的身份证号码字段,我们人为规定该字段不得重复,那么就使用唯一索引。(一般设置学号字段为主键)
JavaEdge
2022/11/30
5970
MySQL普通索引和唯一索引到底什么区别?
MySQL的普通索引和唯一索引到底什么区别?
普通索引可重复,唯一索引和主键一样不能重复。 唯一索引可作为数据的一个合法验证手段,例如学生表的身份证号码字段,人为规定该字段不得重复,那么就使用唯一索引。(一般设置学号字段为主键)
JavaEdge
2022/03/02
3.1K0
MySQL的普通索引和唯一索引到底什么区别?
mysql学习笔记(四)普通索引还是唯一索引
这一篇主要来分析下如何选择普通索引和唯一索引,以及他们在查询时候的原理。
虞大大
2020/12/01
9830
MySQL实战问题01 索引相关
当更新一个数据页时, 若这个数据也在内存中, 就直接更新, 但是如果这个数据页不在内存中, 在不影响数据一致性的前提下. innodb会将这些更新操作缓存在change buffer中, 这样就不需要从磁盘中读入这个数据页了. 下次查询的时候, 将数据页读入内存, 然后执行change buff中与这个页相关的操作.
历久尝新
2020/05/22
7070
数据库索引
哈希表是一种以键-值(key-value)存储数据的结构,只要输入待查找的值即key,就可以找到其对应的值即Value,时间复杂度为O(1),但是容易发生哈希冲突,当发生冲突时,常用开放地址法、拉链法、再散列法解决
素履coder
2022/02/17
4500
数据库索引
change buffer,你了解么?
最近在极客时间看丁奇大佬的《MySQL45讲》,真心觉得讲的不错,把其中获得的一些MySQL方向的经验整理整理分享给大家,有兴趣同学可以购买相关课程进行学习。
AsiaYe
2020/05/06
2.1K0
阿里一面,唯一索引和普通索引如何选择?
很多时候,我们在业务开发的时候,都是直接无脑上手唯一索引,Tell me,多少人考虑过这个问题,唯一索引和普通索引该怎么选择?唯一索引是否会对系统性能造成影响?
飞天小牛肉
2022/02/23
3780
MySQL索引详解
一个数据页满了,按照B+Tree算法,新增加一个数据页,叫做页分裂,会导致性能下降。空间利用率降低大概50%。当相邻的两个数据页利用率很低的时候会做数据页合并,合并的过程是分裂过程的逆过程。
Michel_Rolle
2023/10/29
2.5K1
数据库原理: Change Buffer 是干什么的?
redo log 主要节省的是随机写磁盘的 IO 消耗(转成顺序写),而 change buffer 主要节省的是随机读磁盘的IO消耗。
王小明_HIT
2020/07/16
1.3K0
相关推荐
普通索引和唯一索引,应该怎么选择?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文