文章目录

  • 查询流程区别
  • 更新过程区别
    • change buffer
  • 索引选择
    • change buffer 与 redo log

对于普通索引和唯一索引的使用,对于一个开发来说,我相信更多的区别场景就是:如果需要在库里面做一个唯一限制,就使用唯一索引;否则就使用普通索引了。下面主要介绍一下这 2 种索引的区别(使用MySQL时,大多数场景下使用的是B+ 索引,下面的案例或者描述默认都是 B+ 索引)。

查询流程区别

当我们执行 select * from T where k = 3 时,首先会从 B+ 索引树的树根开始遍历。

1、普通索引:当遍历到 k = 3 的叶子节点后,会继续查询下一个叶子节点是否满足条件,不满足则返回结果集,否则继续查找。

2、唯一索引:当找到 k = 3 的叶子节点后,因为唯一性和等值的查询,此时就会直接返回结果集。

InnoDB 是按照数据页的维度去进行读写的(默认 16KB),所以大多数场景下,普通索引和唯一索引没有什么区别,也就是多了一次CPU计算。当然对于普通索引来讲,有可能读取下一条的数据在第二个数据页上,此时就会多一次 随机IO 访问。这样看上去可能会相对耗时一点,但是这种场景出现的频率相对较少,可以忽略不计。

更新过程区别

change buffer

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

将 change buffer 中的操作应用到原数据页,得到最近的结果叫做 merge 。除了访问会触发 merge 之外,系统还会有线程定期的 merge。在数据库正常关闭的过程中,也会触发 merge。从上面可以看出,如果能够将更新操作记录在 change buffer ,可以减少 随机磁盘访问,从而提高性能。并且数据页读入内存是需要占用 buffer pool 的,所以这种方式还能够避免占用内存,提高内存利用率。

对于唯一索引来说,为了检查唯一性约束,此时必须要将数据页装载到内存,此时直接更新内存更快,就不会使用change buffer 了。因此,只有普通索引可以使用 change buffer,唯一索引不会使用。

change buffer 使用的是 buffer pool 中的内存,因此是有限制的。我们可以通过 innodb_change_buffer_max_size 来动态设置,设置为 50 时表示:change buffer 最多可占用 buffer pool 中的50% 。

从上面可以看出,当我们插入一条数据时。对于普通索引和 唯一索引有如下区别:

1、唯一索引:会首先将数据页载入内存,然后判断是否违反唯一性约束,若不违反则插入数据。

2、普通索引:会将数据直接更新到 change buffer 中,然后就结束了。此时就减少了一次随机IO 的访问,提高了性能。

索引选择

对于读多写少的业务,数据页在写完之后被访问到的可能性比较小,此时使用 change buffer 的效果比较好。常见的有日志、账单类等。反过来,如果数据写入之后立马就会读取,此时开启了 change buffer 就会增加内存开销。

普通索引 + 开启 change buffer 在机械硬盘的机器上,在数据量比较大的时候,可以有性能的明显提升。

change buffer 与 redo log

介绍完 change buffer 的原理之后,下面介绍一下其与 redo log 之间的关系。如在数据库中执行如下语句:

mysql> insert into t(id, k) values (id1, k1), (id2, k2);

假设 k1 所在的数据页在 change buffer 中,k2 所在的数据页不在 change buffer 中,则更新过程如下所示:

从上图可以看出,主要涉及了 4 部分内容:内存(buffer pool)、redo log (ib_log_fileX)、数据表空间系统表空间。其执行流程如下:

  1. k1 对应的数据页 Page1 在内存中,直接更新。

  2. k2 对应的数据页 Page2 不在内存中,就往内存的 change buffer 中记录 add 操作。

  3. 分别记录上述 2 个步骤的 redo log。

执行上述流程之后,插入操作就做完了。上图中虚线的部分是异步的后台操作,不影响客户端的响应时间。

如果在插入请求之后,再次查询时,就会有下图所示的执行流程:

从上图的执行流程可以看出,读取 k1 时,直接从 Page1 的内存中返回;读取 k2 时,先从 磁盘中读取 Page2 到内存,然后合并 change buffer 中的变更,然后返回结果。

从上面 redo log 和 change buffer 对性能的提升:redo log 可以减少随机磁盘IO 的写入,change buffer 可以减少随机磁盘IO 的读取


参考:《极客时间:MySQL实战》、《高性能MySQL》
链接:http://moguhu.com/article/detail?articleId=120

MySQL普通索引和唯一索引的区别相关推荐

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

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

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

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

  3. MySQL普通索引与唯一索引__mysql中唯一索引和普通索引的用途及区别

    MySQL普通索引与唯一索引 索引作用: 提高查询效率,一般加在经常查询或者排序的字段上. 普通索引: 允许字段值重复 唯一索引: 保证数据记录唯一性 如何选择: 查询过程: 对普通索引来说,找到满足 ...

  4. MySQL的普通索引和唯一索引到底什么区别?

    1 概念区分 普通索引 V.S 唯一索引 普通索引可重复,唯一索引和主键一样不能重复. 唯一索引可作为数据的一个合法验证手段,例如学生表的身份证号码字段,人为规定该字段不得重复,那么就使用唯一索引.( ...

  5. MySQL普通索引和唯一索引到底什么区别?

    1 概念区分 普通索引 V.S 唯一索引 普通索引可重复,唯一索引和主键一样不能重复. 唯一索引可作为数据的一个合法验证手段,例如学生表的身份证号码字段,我们人为规定该字段不得重复,那么就使用唯一索引 ...

  6. MySQL主键索引和唯一索引区别

    MySQL主键索引和唯一索引区别 什么是最左前缀原则? 以下回答全部是基于MySQL的InnoDB引擎 例如对于下面这一张表 如果我们按照 name 字段来建立索引的话,采用B+树的结构,大概的索引结 ...

  7. MySQL主键、普通索引和唯一索引的区别、全文索引

    1 概念区分 普通索引 V.S 唯一索引 普通索引可重复,唯一索引和主键一样不能重复. 唯一索引可作为数据的一个合法验证手段,例如学生表的身份证号码字段,人为规定该字段不得重复,那么就使用唯一索引.( ...

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

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

  9. MySQL 普通索引和唯一索引的区别详解

    1 概念区分 普通索引和唯一索引 普通索引可重复,唯一索引和主键一样不能重复. 唯一索引可作为数据的一个合法验证手段,例如学生表的身份证号码字段,我们人为规定该字段不得重复,那么就使用唯一索引.(一般 ...

最新文章

  1. pycharm奇技淫巧 直接通过代码输出函数 refactor —— extract method
  2. 格雷编码Python解法
  3. python开发pandas_二、Python开发---33、pandas(1)
  4. 防止跨站请求伪造(CSRF)攻击 和 防重复提交 的方法的实现
  5. linkscrpit
  6. [转载] python json 编码(dump/dumps:字典转化为json)、解码(load/loads:json转化为字典)
  7. 计算机网络工程师模拟题库,计算机网络工程师模拟题56.doc
  8. [GBA ROM列表]不断补完中……
  9. 微软ad域管理工具_比较好的第三方微软AD域管理工具有哪些?
  10. vue3 ts 手动封装message消息组件
  11. php网页背景音乐代码,怎么用html设置背景音乐
  12. chrome 插件开发指南
  13. mysql x ix_mysql – 为什么IX-lock与InnoDB中的另一个IX-lock兼容?
  14. 霍纳法则c语言算法代码,霍纳法则(Horner Rule)介绍及C语言实现
  15. 英文名字按首字母排序分类显示
  16. Spec2Vec快速入门
  17. 战双服务器维护,战双帕弥什维护到几点 战双帕弥什维护什么时候结束
  18. RespResult
  19. 十个技巧,让你成为“降维”专家
  20. html怎么打五角星符号怎么打,五角星符号怎么打,五角星符号大全

热门文章

  1. 代码修炼之路-木桶布局
  2. 大刀向鬼子们的头上砍去
  3. 疯狂Python讲义学习日志01——变量和简单类型
  4. Windows Vista 中文版快速一览
  5. 五星评分第三方框架 HCSStarRatingView
  6. webpack如何初始化vue项目教程
  7. 2020年10月27日 天学网14:50 视频面试 时长:15min
  8. 《Python Web开发实战》踩地雷记17/3/23
  9. threejs制作城市场景
  10. 为什么要实施代码集体所有?