两种索引对查询语句和更新语句的性能影响来进行分析

查询过程

假设,执行查询的语句是 select id from T where k=5。这个查询语句在索引树上查找的过 程,先是通过 B+ 树从树根开始,按层搜索到叶子节点,也就是图中右下角的这个数据页,然后 可以认为数据页内部通过二分法来定位记录。 对于普通索引来说,查找到满足条件的第一个记录 (5,500) 后,需要查找下一个记录,直到 碰到第一个不满足 k=5 条件的记录。 对于唯一索引来说,由于索引定义了唯一性,查找到第一个满足条件的记录后,就会停止继 续检索。

那么,这个不同带来的性能差距会有多少呢?答案是,微乎其微。

更新过程

在说之前,先引入一个新的东东,change buffer。何为change buffer???

当需要更新一个数据页时,如果数据页在内存中就直接更新,而如果这个数据页还没有在内存中 的话,在不影响数据一致性的前提下,InooDB 会将这些更新操作缓存在 change buffer 中, 这样就不需要从磁盘中读入这个数据页了。在下次查询需要访问这个数据页的时候,将数据页读 入内存,然后执行 change buffer 中与这个页有关的操作。通过这种方式就能保证这个数据逻 辑的正确性。

它存在的意义就是能够减少对硬盘IO的操作,我先保存着更新操作,等你要查,我才拿到缓存中更新,再给你呈现。懂了吗?

回到更新操作。。。

对于唯一索引来说,所有的更新操作都要先判断这个操作是否违反唯一性约束。比如,要插入 (4,400) 这个记录,就要先判断现在表中是否已经存在 k=4 的记录,而这必须要将数据页读入内 存才能判断。如果都已经读入到内存了,那直接更新内存会更快,就没必要使用 change buffer 了。 因此,唯一索引的更新就不能使用 change buffer,实际上也只有普通索引可以使用。

你看接下来这俩种情况你就会恍然大悟

第一种情况是,这个记录要更新的目标页在内存中。这时,InnoDB 的处理流程如下:

  • 对于唯一索引来说,找到 3 和 5 之间的位置,判断到没有冲突,插入这个值,语句执行结 束;
  • 对于普通索引来说,找到 3 和 5 之间的位置,插入这个值,语句执行结束。

这样看来,普通索引和唯一索引对更新语句性能影响的差别,只是一个判断,只会耗费微小的 CPU 时间。

但,这不是我们关注的重点。

第二种情况是,这个记录要更新的目标页不在内存中。这时,InnoDB 的处理流程如下:

  • 对于唯一索引来说,需要将数据页读入内存,判断到没有冲突,插入这个值,语句执行结 束;
  • 对于普通索引来说,则是将更新记录在 change buffer,语句执行就结束了。

由于唯一索引用不上 change buffer 的优化机制,因此如果业务可以接受,从性能角度出发我 建议你优先考虑非唯一索引。

普通索引和唯一索引,傻傻分不清楚?相关推荐

  1. 普通索引和唯一索引,难道还分不清

    本文分享自华为云社区<MySQL的普通索引和唯一索引到底什么区别?>,作者: JavaEdge. 1 概念区分 普通索引 V.S 唯一索引 普通索引可重复,唯一索引和主键一样不能重复. 唯 ...

  2. mysql 普通索引和唯一索引_MySQL 普通索引和唯一索引的区别

    该文为< MySQL 实战 45 讲>的学习笔记,感谢查看,如有错误,欢迎指正 一.查询和更新上的区别 这两类索引在查询能力上是没差别的,主要考虑的是对更新性能的影响.建议尽量选择普通索引 ...

  3. php普通索引和唯一索引,MySQL中普通索引和唯一索引的区别详解

    本篇文章介绍了MySQL中普通索引和唯一索引的区别,讲解很详细,希望对学习MySQL的朋友有帮助! 需要注意的是: redo log中的数据,可能还没有 flush 到磁盘,磁盘中的 Page 1 和 ...

  4. MySQL中的聚簇索引、非聚簇索引、联合索引和唯一索引

    一.索引类型 索引根据底层实现可分为B-Tree索引和哈希索引,大部分时候我们使用的都是B-Tree索引,因为它良好的性能和特性更适合于构建高并发系统. 根据索引的存储方式来划分,索引可以分为聚簇索引 ...

  5. 普通索引和唯一索引的区别以及何时需要建立索引

    大家好,我是IT修真院上海分院第6期学员,一枚正直善良的JAVA程序员. 今天给大家分享一下,修真院官网JAVA任务1中普通索引和唯一索引的区别以及何时建立索引的探讨. 一.背景介绍 索引作用:简而言 ...

  6. php普通索引和唯一索引,mysql下普通索引和唯一索引的效率对比

    昨天有位同事说,他的网页查询过程中发现普通索引和唯一索引的效率是有差别的,普通索引比唯一索引快 今天在我的虚拟机中布置了环境,测试抓图如下: 抓的这几个都是第一次执行的,刷了几次后,取平均值,效率大致 ...

  7. mysql 唯一索引 性能_普通索引和唯一索引的区别、性能差异,以及其他索引简介...

    唯一索引和普通索引使用的结构都是B-tree,执行时间复杂度都是O(log n). 1.普通索引 普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度.因此,应该只为那些最 ...

  8. MySQL中的索引(唯一索引篇)

    MySQL中的索引(唯一索引篇) 唯一索引与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值. 一.如何添加唯一索引 直接创建唯一索引 Create unique index 索引名 on ...

  9. 聚簇索引、非聚簇索引、普通索引、唯一索引

    一.聚簇索引 VS 非聚簇索引 聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据 非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,myisam通过key_buf ...

最新文章

  1. iOS--MD5加密封装
  2. 介绍一个.Net资源站点
  3. CO CCA-作业分割优先级
  4. PHPMySQL——防止SQL注入-代码片段
  5. 用python前端html后端django_浅谈Django前端后端值传递问题
  6. 安卓监听软键盘搜索键
  7. webpack 3 零基础入门教程 #6 - 使用 loader 处理 CSS 和 Sass
  8. ORACLE关联查询
  9. 探寻安全管理平台(SOC)项目的关键成功因素(4)
  10. 正则表达式:基础知识学习
  11. 创新团队中常见的几种“怪人”
  12. 玩转你的AlphaGo(MAC OS)
  13. logistic人口模型python代码_人口模型(马尔萨斯--vs--logistic).ppt
  14. 定投复利公式 php,基金定投收益计算公式和复利计算公式
  15. win10巨帧数据包在哪里设置_电脑和路由器mtu值怎样设置才网速最快
  16. PNP NPN 三线制接近开关接线
  17. 山海演武传·黄道·第一卷 雏龙惊蛰 第二章 修闵本饰邪
  18. 如何去除word中的空行
  19. 谈谈四天三夜的感受【记录篇】
  20. idea创建分支、合并分支、解决分支冲突

热门文章

  1. 带你深入理解分布式事务,掌握后台分布式核心技术,PS:送5本!
  2. 动态规划套路:最大子数组和
  3. 音视频出海,如何乘风破浪?
  4. 如何ALL IN一场技术大会?
  5. 雷辉:让视频会议conferencing like TV
  6. 浏览器预连接性能测试
  7. 如何让xtrabackup恢复速度提升20倍?
  8. nginx-rtmp message
  9. vim编辑器---批量注释与反注释
  10. WebStorm使用TypeScript