普通索引和唯一索引有什么区别?如果我们的业务中已经能够保证索引的唯一性,那么我们到底要建什么索引呢?

查询逻辑

现在有一条sql:

select id from t where k = 5; k是索引

普通索引:Mysql会到索引树中按层级查询到第一个满足k=5的数据后,需要继续往后查找到第一个不为5的数后返回。

唯一索引:Mysql会到索引树种按层级查询到第一个满足k=5的数据,由于k是唯一索引,索引可以不用再往后查,直接返回。

所以对于查询来说,普通索引比唯一索引会多查询一次索引树,但是这种消耗可以忽略不计。

更新逻辑

正常的数据更新逻辑是:如果数据对应的数据页在内存中,那么直接更新;如果数据页不在内存中呢?

Mysql在数据一致性可以保证的前提下,使用了change buffer。如果数据页不在内存中,则先将更新缓存在change buffer中,等这个数据页被读到内存的时候,再将更新Merge到数据页中,而且后台还会有线程定时执行merge操作。change buffer也是可以序列化到磁盘中的,所以哪怕数据库宕机数据也不会丢失。

那么对于普通索引来说,更新流程就是在数据页不在内存中,直接将更新操作缓存在change buffer中;但是对于唯一索引来说,由于在插入数据的时候必须保证索引的唯一性,所以必须要把对应的数据页读到内存中判断唯一,然后将数据更新到数据页中。这就导致再插入的时候无法使用change buffer来优化插入。

change buffer 可以通过 innodb_change_buffer_max_size 来设置。表示占用buffer pool的比例。如果值为50,表示占用50%的buffer pool内存大小。

通过上面的分析,普通索引和唯一索引只有在更新的时候会有比较大的性能区别。那么什么时候用普通索引呢?

  1. 如果插入语句后面紧跟着就要查询改数据,那么使用唯一索引比较合适。

分析:如果插入的时候,数据页不在内存中,那么直接将更新缓存到change buffer中,但是紧跟着就要查询该数据,所以Mysql需要把对应的数据页读取到内存中,此时还需要做merge操作。而唯一索引直接读到数据页到内存插入,再读也是直接从内存中读,此时change buffer的额外花销反而更大。

  1. 如果所有业务不能保证数据唯一性,靠Mysql保证,那肯定直接就使用唯一索引了。
  2. 如果频繁更新的表,比如日志表或者历史数据归档表等,使用普通索引会更高效。尤其是对于大量插入操作,因为change buffer越大,一次merge带来的效益也最高。

到此,我们可以检测一下我们现在业务中,有没有频繁插入的表中使用了唯一索引呢?

普通索引or唯一索引?相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. 普通索引和唯一索引,傻傻分不清楚?

    两种索引对查询语句和更新语句的性能影响来进行分析 查询过程 假设,执行查询的语句是 select id from T where k=5.这个查询语句在索引树上查找的过 程,先是通过 B+ 树从树根开 ...

  8. 数据库的几个概念:主键,外键,索引,唯一索引

    主键: 主键是数据表的唯一索引,比如学生表里有学号和姓名,姓名可能有重名的,但学号确是唯一的,你要从学生表中搜索一条纪录如查找一个人,就只能根据学号去查找,这才能找出唯一的一个,这就是主键;如:id ...

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

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

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

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

最新文章

  1. MySQL · myrocks · MyRocks之memtable切换与刷盘
  2. 21天学MySQL_把整个Mysql拆分成21天,轻松掌握,搞定(下)
  3. 添加水印(文字and图片)
  4. 1.6 开发集和测试集的大小-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授
  5. 《高性能JavaScript》第八章 编程实践
  6. Java四大函数式接口
  7. mysql db link_oracle11G数据库db_link连接mysql配置(Windows下无需安装Gateway组件)
  8. 想知道电脑录屏软件哪个好用?这三个工具轻松实现屏幕录制
  9. 12-Qt5调用OpenCV4
  10. Kopernio插件+SCI-HUB最新可用网址
  11. 一些简单的局域网入侵命令
  12. C++ Primer Plus课后编程练习第6章参考代码
  13. 问题 D: 分解质因数
  14. Typora使用总结
  15. 一份颠覆小米魅族的营销计划
  16. 中国大学mooc 实用Python程序设计练习题
  17. 31w赛题奖金!当 AI for Science 撞上“先导杯”,会擦出什么样的火花?
  18. 干货 |VALSE 2019总结 --PPT 打包下载
  19. kali安装webdav服务
  20. 温故知新——前向传播算法和反向传播算法(BP算法)及其推导

热门文章

  1. 无人超市信息管理系统——问题定义
  2. Extjs的一些方法
  3. c# 实现hello word 详解版
  4. Pytho经典面试题荟萃:第一期
  5. xcode 可以打开xmind_解决问题,99%的xmind使用者不会的技巧
  6. 对于双欧拉角(正反欧拉角)的一些理解和思考
  7. 2023全新小鬼授权系统PHP源码完全解密版
  8. HTML 简介及 HTML 的常用标签
  9. c# panel里面嵌入窗体
  10. 宝骏4s店维修记录怎么查询?