问题:当一个字段同时满足唯一索引和普通索引的情况下,我们要如何抉择呢?
要弄清楚这个问题,我们首先要了解唯一索引和普通索引的实现原理,我们通过查询操作更新操作分别来对比他们之间的区别

附带一提,普通索引和唯一索引的区别:首先,他们都是索引,然后从字面上来看,普通,就是可重复的索引,唯一索引,就是不可重复的索引。因此他们俩的区别就是一个key可以重复,一个不可重复。

查询操作

普通索引:查找到满足条件的第一个记录后,需要查找下一个记录,直到碰到第一个不满足条件的记录。
唯一索引:由于索引定义了唯一性,查找到第一个满足条件的记录后,就会停止继续检索。
因此,普通索引相对于唯一索引要多一些操作。但是,他们之间对于性能的差距却是微乎其微,想知道为什么的朋友可以自己去查询一下相关资料。

更新操作

为了说明普通索引和唯一索引对更新语句性能的影响这个问题,我需要先跟你介绍一下 change buffer
当需要更新一个数据页时,如果数据页在内存中就直接更新,而如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下,
InooDB 会将这些更新操作缓存在 change buffer 中,这样就不需要从磁盘中读入这个数据页了。
在下次查询需要访问这个数据页的时候,将数据页读入内存,然后执行 change buffer 中与这个页有关的操作。
通过这种方式就能保证这个数据逻辑的正确性。需要说明的是,虽然名字叫作 change buffer,实际上它是可以持久化的数据。也就是说,
change buffer 在内存中有拷贝,也会被写入到磁盘上。
将 change buffer 中的操作应用到原数据页,得到最新结果的过程称为 merge。除了访问这个数据页会触发 merge 外,系统有后台线程会定期 merge。
在数据库正常关闭(shutdown)的过程中,也会执行 merge 操作。
显然,如果能够将更新操作先记录在 change buffer,减少读磁盘,语句的执行速度会得到明显的提升。
而且,数据读入内存是需要占用 buffer pool 的,所以这种方式还能够避免占用内存,提高内存利用率。

了解了change buffer之后,我要跟大家说的是,只有普通索引才能使用change buffer,唯一索引的更新不能使用change buffer。
但是并不是说,有change buffer就会更好,我们根据上面的原理可以了解到,change buffer是在业务下一次做查询的时候,就会触发merge的过程,
这样随机访问 IO 的次数不会减少,反而增加了 change buffer 的维护代价。
因此在更新操作后马上就要查询的业务情景下,你应该关闭 change buffer, 而在其他情况下,change buffer 都能提升更新性能

回到我们文章开头的问题,普通索引和唯一索引应该怎么选择。

其实,这两类索引在查询能力上是没差别的,主要考虑的是对更新性能的影响。
所以,我建议你尽量选择普通索引

博文参考资料:

《Mysql实战45讲》第九讲09 | 普通索引和唯一索引,应该怎么选择?

唯一索引和普通索引的区别:https://www.jianshu.com/p/dd4fe101cffe

Mysql优化——唯一索引和普通索引的选择相关推荐

  1. mysql优化说出九条_技术分享 | MySQL 优化:为什么 SQL 走索引还那么慢?

    原标题:技术分享 | MySQL 优化:为什么 SQL 走索引还那么慢? 背景 2019-01-11 9:00-10:00 一个 MySQL 数据库把 CPU 打满了. 硬件配置:256G 内存,48 ...

  2. 最左前缀 mysql优化器_mysql查询优化之索引类型、最左前缀

    一.什么是索引?索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录.表里 ...

  3. MySQL优化篇:单表索引失效

    文章目录 1.准备环境 2.全值匹配我最爱 2.最佳作前缀法则 3.不要在索引列上做任何计算 3.1 在查询列上使用了函数 3.2 在查询列上做了转换 4.索引列上不能有范围查询 5.尽量使用覆盖索引 ...

  4. MySQL优化(二):索引的类型、匹配原则、创建原则

    目录 索引的优缺点 索引类型 聚簇索引(主键索引) 非聚簇索引(二级索引.辅助索引) 索引匹配的原则 最左匹配原则 无法使用索引的场景 索引创建的原则 使不使用索引的依据到底是什么? 参考 索引的优缺 ...

  5. mysql 走索引 很慢_技术分享 | MySQL优化:为什么SQL走索引还那么慢?

    作者:胡呈清 背景 2019-01-11 9:00-10:00 一个 MySQL 数据库把 CPU 打满了. 硬件配置:256G 内存,48 core 分析过程 接手这个问题时现场已经不在了,信息有限 ...

  6. Mysql优化,导致查询不走索引的原因总结

    原文地址:http://blog.csdn.net/m0_37808356/article/details/72526687 最近公司让我做SQL优化的工作(MySql),用explain发了一些问题 ...

  7. MySQL优化系列(二)--查找优化(1)(非索引设计)

    MySQL优化系列(二)--查找优化(1)(非索引设计) 接下来这篇是查询优化,用户80%的操作基本都在查询,我们有什么理由不去优化他呢??所以这篇博客将会讲解大量的查询优化(索引以及库表结构优化等高 ...

  8. MySQL的索引(普通索引、唯一索引,主键索引、组合索引、全文索引、空间索引)相关操作

    目录 索引介绍 Hash索引和B+tree索引的区别 应用场景 索引分类 普通索引 创建单列索引--普通索引(3种语法) 查看数据库中的索引 查看数据表中的索引 删除索引 唯一索引 主键索引 组合索引 ...

  9. mysql调优(六)--索引的基础知识

    思维导图 一.索引的优点 1.大大减少了服务器需要扫描的数据量. 2.帮助服务器避免排序和临时表. 3.将随机io变成顺序io. 问题一.什么是随机io和顺序io. 顺序IO是指读写操作的访问地址连续 ...

最新文章

  1. 2020 最新自动驾驶技术报告出炉:Waymo、特斯拉、沃尔沃技术方案大起底
  2. 物联网正在给批发业带来新的商业模式
  3. (转)hibernate 注解的问题(异常)集合
  4. 树莓派学习笔记——GPIO功能学习
  5. 解析java中的数组
  6. java循环语句_java中循环语句
  7. 查询计算机专业及选修了英语的学生,实验五 数据库综合查询(学生)
  8. “秃如其来”的90后,造就了一个蒸蒸日上的产业
  9. powershell自动化操作AD域、Exchange邮箱系列(5)——AD模块加载与命令一览
  10. Eolinker——前置用例返回的reponse值进行传递
  11. ubuntu ffmpeg 下载安装
  12. win10电脑网速慢怎么解决
  13. 安卓手机管理_七色米ERP(七色米ERP进销存管理)V1.2.1 安卓手机版
  14. 上周内外盘行情回顾及交易情况2022.4.4
  15. 关于我为什么跨考计算机研究生以及对未来的思考
  16. 华为光猫路由器做交换机用
  17. 火车头如何下载附件文件
  18. Elastic 7.15 版:数秒之内打造强大的个性化搜索体验
  19. 微信小程序注册入口及流程(完整版教程)
  20. 最全的软件测试面试题(含答案)

热门文章

  1. 5G时代的来临,我们应该做好哪些网络安全准备?
  2. 纯前端实行—简单的用户信息记录界面
  3. open vas简介
  4. 排列组合 南阳理工学院第三届省内高校新生程序设计大赛(决赛)A. 湮灭残昼
  5. XMLHttpRequest状态
  6. win10 安装k8s
  7. chrome设置黑暗模式的4种方法
  8. 计算机知识竞赛活动工作总结,知识竞赛活动工作总结
  9. 远光九天云平台 自主创新助力科技自强
  10. 无情,才是世上最远的距离!