普通索引or唯一索引?
普通索引和唯一索引有什么区别?如果我们的业务中已经能够保证索引的唯一性,那么我们到底要建什么索引呢?
查询逻辑
现在有一条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内存大小。
通过上面的分析,普通索引和唯一索引只有在更新的时候会有比较大的性能区别。那么什么时候用普通索引呢?
- 如果插入语句后面紧跟着就要查询改数据,那么使用唯一索引比较合适。
分析:如果插入的时候,数据页不在内存中,那么直接将更新缓存到change buffer中,但是紧跟着就要查询该数据,所以Mysql需要把对应的数据页读取到内存中,此时还需要做merge操作。而唯一索引直接读到数据页到内存插入,再读也是直接从内存中读,此时change buffer的额外花销反而更大。
- 如果所有业务不能保证数据唯一性,靠Mysql保证,那肯定直接就使用唯一索引了。
- 如果频繁更新的表,比如日志表或者历史数据归档表等,使用普通索引会更高效。尤其是对于大量插入操作,因为change buffer越大,一次merge带来的效益也最高。
到此,我们可以检测一下我们现在业务中,有没有频繁插入的表中使用了唯一索引呢?
普通索引or唯一索引?相关推荐
- php普通索引和唯一索引,mysql下普通索引和唯一索引的效率对比
昨天有位同事说,他的网页查询过程中发现普通索引和唯一索引的效率是有差别的,普通索引比唯一索引快 今天在我的虚拟机中布置了环境,测试抓图如下: 抓的这几个都是第一次执行的,刷了几次后,取平均值,效率大致 ...
- mysql 普通索引和唯一索引_MySQL 普通索引和唯一索引的区别
该文为< MySQL 实战 45 讲>的学习笔记,感谢查看,如有错误,欢迎指正 一.查询和更新上的区别 这两类索引在查询能力上是没差别的,主要考虑的是对更新性能的影响.建议尽量选择普通索引 ...
- php普通索引和唯一索引,MySQL中普通索引和唯一索引的区别详解
本篇文章介绍了MySQL中普通索引和唯一索引的区别,讲解很详细,希望对学习MySQL的朋友有帮助! 需要注意的是: redo log中的数据,可能还没有 flush 到磁盘,磁盘中的 Page 1 和 ...
- mysql 唯一索引 性能_普通索引和唯一索引的区别、性能差异,以及其他索引简介...
唯一索引和普通索引使用的结构都是B-tree,执行时间复杂度都是O(log n). 1.普通索引 普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度.因此,应该只为那些最 ...
- MySQL中的索引(唯一索引篇)
MySQL中的索引(唯一索引篇) 唯一索引与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值. 一.如何添加唯一索引 直接创建唯一索引 Create unique index 索引名 on ...
- 聚簇索引、非聚簇索引、普通索引、唯一索引
一.聚簇索引 VS 非聚簇索引 聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据 非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,myisam通过key_buf ...
- 普通索引和唯一索引,傻傻分不清楚?
两种索引对查询语句和更新语句的性能影响来进行分析 查询过程 假设,执行查询的语句是 select id from T where k=5.这个查询语句在索引树上查找的过 程,先是通过 B+ 树从树根开 ...
- 数据库的几个概念:主键,外键,索引,唯一索引
主键: 主键是数据表的唯一索引,比如学生表里有学号和姓名,姓名可能有重名的,但学号确是唯一的,你要从学生表中搜索一条纪录如查找一个人,就只能根据学号去查找,这才能找出唯一的一个,这就是主键;如:id ...
- MySQL普通索引与唯一索引__mysql中唯一索引和普通索引的用途及区别
MySQL普通索引与唯一索引 索引作用: 提高查询效率,一般加在经常查询或者排序的字段上. 普通索引: 允许字段值重复 唯一索引: 保证数据记录唯一性 如何选择: 查询过程: 对普通索引来说,找到满足 ...
- MySQL 普通索引和唯一索引的区别详解
1 概念区分 普通索引和唯一索引 普通索引可重复,唯一索引和主键一样不能重复. 唯一索引可作为数据的一个合法验证手段,例如学生表的身份证号码字段,我们人为规定该字段不得重复,那么就使用唯一索引.(一般 ...
最新文章
- MySQL · myrocks · MyRocks之memtable切换与刷盘
- 21天学MySQL_把整个Mysql拆分成21天,轻松掌握,搞定(下)
- 添加水印(文字and图片)
- 1.6 开发集和测试集的大小-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授
- 《高性能JavaScript》第八章 编程实践
- Java四大函数式接口
- mysql db link_oracle11G数据库db_link连接mysql配置(Windows下无需安装Gateway组件)
- 想知道电脑录屏软件哪个好用?这三个工具轻松实现屏幕录制
- 12-Qt5调用OpenCV4
- Kopernio插件+SCI-HUB最新可用网址
- 一些简单的局域网入侵命令
- C++ Primer Plus课后编程练习第6章参考代码
- 问题 D: 分解质因数
- Typora使用总结
- 一份颠覆小米魅族的营销计划
- 中国大学mooc 实用Python程序设计练习题
- 31w赛题奖金!当 AI for Science 撞上“先导杯”,会擦出什么样的火花?
- 干货 |VALSE 2019总结 --PPT 打包下载
- kali安装webdav服务
- 温故知新——前向传播算法和反向传播算法(BP算法)及其推导