Mysql唯一索引和普通索引的区别

  • 查询和更新上的区别
    • 查询操作
    • 更新操作

查询和更新上的区别

查询操作

这两类索引在查询上差别不大,主要是更新上的差别。

查询的时候

普通索引:查找到第一条满足条件的记录后,继续向后遍历,直到第一个不满足条件的记录。
唯一索引:由于索引定义了唯一性,查找到第一条满足条件的记录后,直接停止继续检索。

普通索引会多检索一次,几乎没什么影响。因为InnDB是按照数据页为单位去读取数据的, 需要读取数据时,并不是直接去磁盘中读取的数据,而是读取数据页到内存,然后再从数据页中检索数据。每个数据页是16kb,对整型字段,一个数据页可以存放近1000个key,除非要读取的数据正好在数据页的最后一条记录,就需要重新再去读一个数据页,这种情况很少,对CPU的消耗基本可以忽略。
因此,这两类索引在查询上的区别基本没差别。

更新操作

更新操作并不是直接对磁盘中的数据进行更新,而是把数据页从磁盘读到内存,再更新数据页。

普通索引:
以数据页为单位,把数据从磁盘读到内存,然后更新内存中的数据。
唯一索引:
以数据页为单位,把数据从磁盘督导内存,判断是否唯一再更新内存中的数据。

mysql中有个change buffer机制,普通索引可以用chang buffer,唯一索引用不了。
chang buffer 的作用是 降低IO操作,chang buffer 将数据写入数据页的操作叫做merge。
普通索引,如果需要更新的数据页在内存中,则直接更新数据页,如果不在,则会先将操作记录到change buffer,当下次读取数据页是,顺带merge到数据页中,change buffer也有定期merge策略。数据库正常关闭时,也会触发merge。
唯一索引,更新前需要先判断数据是否唯一。如果数据页在内存中 就可以直接判断并更新,如果不在内存中,则需要从磁盘中读出来,再判断更新,所以用不到change buffer.

扩展:change buffer 用的是buffer pool里的内存,因此不能无限增大,change buffer 的大小可以通过参数inndb_change_buffer_max_size来动态设。例如这个参数设置的是50时,表示change buffer 的大小最多只能占用 change pool 的 50%。

总结:mysql 唯一索引和普通索引 在读操作上基本没有什么差别,只是普通索引比唯一索引多检索一次,几乎没什么影响。在写操作上有区别。两种类型的索引在写操作时都是 把数据页先从磁盘读到内存,再更新,但唯一索引更新前会判断数据是否唯一再更新,并且当数据页不在内存中时,普通索引能用 change buffer 先记录更新操作,等下次再读数据页时,顺带merge到数据页,而唯一索引是 需要从磁盘中读取数据页后判断是否唯一再更新,用不到change buffer.

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

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

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

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

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

  3. Mysql唯一索引和普通索引的区别,

    文章目录 Mysql唯一索引和普通索引的区别,那种速度快一点,原因是啥 理由说明: 结论: 1 普通索引 2 唯一索引 注意:唯一索引和普通索引使用的结构都是B-tree,执行时间复杂度都是O(log ...

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

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

  5. mysql 唯一索引和复合索引 区别_MySQL复合唯一索引分析

    MySQL复合唯一索引分析 关于复合唯一索引(unique key 或 unique index),网上搜索不少人说:"这种索引起到的关键作用是约束,查询时性能上没有得到提高或者查询时根本没 ...

  6. Mysql主键索引,普通索引索引,唯一索引的区别

    主键索引: 主键索引不可以为空 主键索引可以做外键 一张表中只能有一个主键索引 普通索引: 用来加速数据访问速度而建立的索引.多建立在经常出现在查询条件的字段和经常用于排序的字段. 被索引的数据列允许 ...

  7. MySQL唯一索引与主键的区别:主键相当于一本书的页码,索引相当于书的目录

    主键是一种约束,唯一索引是一种索引,两者在本质上是不同的: 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键: 主键列不允许为空值,唯一性索引列允许空值: 主键列在创建时,已经默认为非空值 ...

  8. mysql唯一索引和联合索引的区别_mysql中,索引,主键,唯一索引,联合索引的区别...

    索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针. 普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度. ...

  9. MySQL的btree索引和hash索引的区别

    Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-T ...

  10. hash 值重复_MySQL调优实战:MySQL B+Tree索引和Hash索引的区别?

    点击上方"Java分享吧",选择"设为星标" 优选有价值的技术文献,从我做起 MySQL技术篇章 1.B+Tree索引 1.B+Tree首先是有序结构,为了不至 ...

最新文章

  1. 第一次作业:阅读优秀博文谈感想
  2. 汉邦高科范俊峰:关于透雾摄像机那点事
  3. 2020牛客暑期多校训练营(第二场)Just Shuffle
  4. javabean 连接mysql_连接mysql的javabean实例+简单分页
  5. antd 获取table选中行数据_element-ui 组件el-table默认选中行setCurrentRow采坑记
  6. 【python】将json字符串转化为json对象
  7. status函数python_python之路-函数
  8. Unity接入海康威视门禁(获取门禁状态信息、门禁反控等)
  9. oracle裁员原因_Oracle中国良心裁员:首批900人,赔偿N+6
  10. python中列表下标,python打印列表中指定元素的所有下标
  11. 暗影精灵 6 Plus 快速上手 大量游戏实测
  12. URL 的参数(query)是什么,以及如何解析获取
  13. apmserv mysql密码_apmserv中修改mysql的root与phpmyadmin密码方法介绍
  14. 【STM32CubeMX安装】
  15. Linux中 screen命令下 实现屏幕滚动
  16. 想多活几年吗??在中国到底什么能吃什么不能吃!(转)
  17. 微信红包c语言程序,C语言 微信红包
  18. 字符串格式化:Formatter类
  19. 2022考研日语71分自学经验贴;日语可以自学吗?
  20. Kubernetes安装系列之Node-Kubelet安装

热门文章

  1. SOC厂商--全志瑞芯微
  2. 魔兽地图编辑器插件YDWE的使用与基本设置5 触发编辑器5 物品合成(2种方式)
  3. python 省份排序_MySQL
  4. IPFS为什么被学者称为数据的“黄金保险柜”?
  5. TeraTerm SSH 登陆
  6. 官方VM tools下载地址
  7. 11月8日 课程设计幸运抽奖系统
  8. 互联网知识大全:软件开发中和各种开发软件文档的常见的英文缩写,还不快快收藏!
  9. 基于微信小程序办公用品采购系统的设计与实现.rar(毕业论文+程序源码+后端源码)
  10. 初始单片机 ----自学笔记