mysql唯⼀索引读写性能影响_《Mysql-索引(唯⼀索引和普通
索引的选择)Change。。。
⼀:概述
- 如果业务代码已经保证了不会写⼊重复的⾝份证号。
- 从性能的⾓度考虑,你会为这个⾝份证号,选择唯⼀索引还是普通索引呢?选择的依据是什么呢?
- 这就要从他们的执⾏过程看起。
⼆:唯⼀索引 和 普通索引 的查询过程?
- 例如
浮窗广告代码- 执⾏查询的语句是 select id from T where k=5
- 查询语句在索引树上查的过程
- 先是通过 B+ 树从树根开始,按层搜索到叶⼦节点,定位数据页。
-
数据页内部通过⼆分法来定位记录。
- 对于普通索引来说
- 查到满⾜条件的第⼀个记录 k=5 后,需要查下⼀个记录。
汇编语言程序设计实用教程- 直到碰到第⼀个不满⾜ k=5 条件的记录。
- 对于唯⼀索引来说
- 由于索引定义了唯⼀性,查到第⼀个满⾜条件的记录后,就会停⽌继续检索。
三:唯⼀索引 和 普通索引 的查询性能⽐较?
- 性能之差 微乎其微
- 原因
- InnoDB 的数据是按数据页为单位来读写的。
- 当需要读⼀条记录的时候,并不是将这个记录本⾝从磁盘读出来,⽽是以页(InnoDB 中,每个数据页的⼤⼩默认是 16KB)为单位,将其整体读⼊内存。
- 那么,对于普通索引来说,要多做的那⼀次“查和判断下⼀条记录”的操作,就只需要⼀次指针寻和⼀次计算。
- 当然,如果 k=5 这个记录刚好是这个数据页的最后⼀个记录,那么要取下⼀个记录,必须读取下⼀个数据页,这个操作会稍微复杂⼀些。
- 但是,对于整型字段,⼀个数据页可以放近千个 key,因此出现这种情况的概率会很低。
- 所以,我们计算平均性能差异时,仍可以认为这个操作成本对于现在的 CPU 来说可以忽略不计。
四:既然在查询性能⼀致,那么他们的更新性能呢,在讨论更新之前,我们来看下 InnoDB 对于更新的优化 Chage Buffer.
五:Change Bufferlinux下载pycharm命令
- 原理(当需要更新⼀个数据时)
- 如果数据页在内存中就直接更新。
- 如果数据页不在内存中。
-
在不影响数据⼀致性的前提下,InooDB 会将这些更新操作缓存在 change buffer 中,这样就不需要从磁盘中读⼊这个数据页了。
- 在下次查询需要访问这个数据页的时候,将数据页读⼊内存,然后执⾏ change buffer 中与这个页有关的操作。
- 通过这种⽅式就能保证这个数据逻辑的正确性。
- Change buffer 什么时候会真正的更新 ?
- 虽然名字叫作 change buffer,实际上它是可以持久化的数据。简述smart原则
- 也就是说,change buffer 在内存中有拷贝,也会被写⼊到磁盘上。
- 将 change buffer 中的操作应⽤到原数据页,得到最新结果的过程称为 merge。
- 除了访问这个数据页会触发 merge 外,系统有后台线程会定期 merge。
- 在数据库正常关闭(shutdown)的过程中,也会执⾏ merge 操作。
- 为什么需要 Change Buffer ?
- 显然,如果能够将更新操作先记录在 change buffer,减少读磁盘,语句的执⾏速度会得到明显的提升。
- ⽽且,数据读⼊内存是需要占⽤ buffer pool 的,所以这种⽅式还能够避免占⽤内存,提⾼内存利⽤率。
- Change buffer 的使⽤场景?
- 因为 merge 的时候是真正进⾏数据更新的时刻,⽽ change buffer 的主要⽬的就是将记录的变更动作缓存下来
- 所以在⼀个数据页做 merge 之前,change buffer 记录的变更越多(也就是这个页⾯上要更新的次数越多),收益就越⼤。
- 因此,对于写多读少的业务来说,页⾯在写完以后马上被访问到的概率⽐较⼩,此时 change buffer 的使⽤效果最好。
- 这种业务模型常见的就是账单类、⽇志类的系统。
- 反过来,假设⼀个业务的更新模式是写⼊之后马上会做查询。
mysql怎么读英语- 那么即使满⾜了条件,将更新先记录在 change buffer,但之后由于马上要访问这个数据页,会⽴即触发 merge 过程。
- 这样随机访问 IO 的次数不会减少,反⽽增加了 change buffer 的维护代价。
- 所以,对于这种业务模式来说,change buffer 反⽽起到了副作⽤。
六:在看 唯⼀索引 和 普通索引的性能问题?
- 唯⼀索引
- 所有的更新操作都要先判断这个操作是否违反唯⼀性约束。
- ⽐如,要插⼊ (4,400) 这个记录,就要先判断现在表中是否已经存在 k=4 的记录,⽽这必须要将数据页读⼊内存才能判断。
- 如果都已经读⼊到内存了,那直接更新内存会更快,就没必要使⽤ change buffer 了。
- 因此,唯⼀索引的更新就不能使⽤ change buffer,实际上也只有普通索引可以使⽤。
- 普通索引
- 正常使⽤ change buffer 更新。
- 结论
- 其实,这两类索引在查询能⼒上是没差别的,主要考虑的是对更新性能的影响。
- 如果所有的更新后⾯,都马上伴随着对这个记录的查询,那么你应该关闭 change buffer。⽽在其他情况下,change buffer 都能提升更新性能。
- 在实际使⽤中,你会发现,普通索引和 change buffer 的配合使⽤,对于数据量⼤的表的更新优化还是很明显的。
七:Redo log 和 Change Buffer
- 能⼒
- Redo log ⽤于写⼊内存,完成更改,提供 cash-safe 的能⼒。
- Change Buffer ⽤于记录更新内容,批量更新。
- 共同⼯作流程
- 更新数据
- 在内存中,直接更新内存;
- 没有在内存中,就在内存的 change buffer 区域,记录下“我要更改 xxx”这个信息
- 将上述两个动作记⼊ redo log 中.
- 事务完成。
- 执⾏这条更新语句的成本很低,就是写了两处内存,然后写了⼀处磁盘(两次操作合在⼀起写了⼀次磁盘),⽽且还是顺序写的。
-优势
- Redo log 主要节省的是随机写磁盘的 IO 消耗(转成顺序写),⽽ Change Buffer 主要节省的则是随机读磁盘的 IO 消耗。
【MySQL 5.7 Reference Manual】15.4.2 Change Buffer(变更缓冲)
15.4.2 Change Buffer(变更缓冲) The change buffer is a special data structure that caches changes t
o se ...
MySQL 5.7 Reference Manual】15.4.2 Change Buffer(变更缓冲)
15.4.2 Change Buffer(变更缓冲) The change buffer is a special data structure that caches changes to se ...
普通索引和唯⼀索引如何选择(谈谈change buffer)
假设有⼀张市民表(本篇只需要⽤其中的name和id_card字段,有兴趣的可以翻看“索引”篇,⾥⾯有建表语句) 每个⼈都有⼀个唯⼀的⾝份证号,且业务代码已经保证不会重复. 由于业务需求,市民需要按⾝份 ...
Mysql索引介绍及常见索引(主键索引、唯⼀索引、普通索引、全⽂索引、组合索引)的区别
Mysql索引概念:说说Mysql索引,看到⼀个很少⽐如:索引就好⽐⼀本书的⽬录,它会让你更快的到内容,显然⽬录(索引)并不是越多越好,假如这本书1000页,有500也是⽬录,它当然效率低,⽬录是要 ...
Mysql主键索引、唯⼀索引、普通索引、全⽂索引、组合索引的区别
原⽂:Mysql主键索引.唯⼀索引.普通索引.全⽂索引.组合索引的区别 Mysql索引概念: 说说Mysql索引,看到⼀个很少⽐如:索引就好⽐⼀本书的⽬录,它会让你更快的到内容,显然⽬录(索引)并不 ...
【mysql】主键、普通索引、唯⼀索引和全⽂索引的⽐较
YSQL索引⽤来快速地寻那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执⾏查询时MySQL必须从第⼀个记录 开始扫描整个表的所有记录,直⾄到符合要求的记录.表⾥⾯的记 ...
mysql索引之⼀:索引基础(B-Tree索引、哈希索引、聚簇索引、全⽂(Full-text)索引区别)(唯⼀索引、最左前缀索引、前缀索引、多列索引)
没有索引时mysql是如何查询到数据的 索引对查询的速度有着⾄关重要的影响,理解索引也是进⾏数据库性能调优的起点.考虑如下情况,假设数据库中⼀个表有10^6条记录,DBMS的页⾯⼤⼩为4K,并存储10 ...
MySQL 创建唯⼀索引忽略对已经重复数据的检查
MySQL 创建唯⼀索引忽略对已经重复数据的检查 在创建唯⼀索引的基础上加上关键字"IGNORE "即可.(注意,经测试,在5.7版本已经不再⽀持该参数) # 重复数据 mysql ...
mysql使⽤唯⼀索引避免插⼊重复数据
使⽤MySQL 索引防⽌⼀个表中的⼀列或者多列产⽣重复值 ⼀:介绍MYSQL唯⼀索引 如果要强烈使⼀列或多列具有唯⼀性,通常使⽤PRIMARY KEY约束. 但是,每个表只能有⼀个主键. 因此,如果使 ...
随机推荐
JavaWeb学习记录(⼆⼗七)——定时发送邮件ServletContextListener监听实现
public class EmailSendListener implements ServletContextListener{ @Override public void contextDe ...
你有没有试过“闭上眼”使⽤:京东、滴滴、QQ、⽀付宝?
正在看这篇⽂章的同学,也许是幸运的. 互联⽹的发展,让我们的⽣活越来越便利,但这个“我们”,也许并不包括那些残障⼈⼠.正常⼈眼⾥来说再简单不过的页⾯操作,对于盲⼈来说都是不可攀越的⾼墙.换句话说,越⾏ ...
sqlserver数据库导⼊Mysql数据库问题
近来遇到⼀个问题,之前的项⽬⽤的是SQLServer数据库,但是现在要换成MySQL数据库,所有整理了⼀些数据导⼊的步骤,供需要的⼈参考!第⼀步: 第⼆步: 第三步: 第四步: 第五步: 第六步: ...
【Teradata TTU】Windows TTU安装⼯具列表
Version Display Name-------------------------------------------------------------------------------- ...
mesbox公告加更新控制
0为不显⽰,1为显⽰~~~~0|友情提⽰:任何时候,不要相信福利软件,福利⽹站,不乱接收别⼈发的的任何⽂件,如需使⽤军旗有关产品,请⾄官⽅或官⽅⽹站下载!!|183|173~~~~162,1651, ...
Linux基础 -Ubuntu
Ubuntu 下: sudo 以管理员权限执⾏ apt 是Advanced Packaging Tool ,Ubuntu下的安装包管理⼯具,早期使⽤apt-get,从Ubuntu16开始建议使⽤apt ...
unity API 之EventSystem.current.IsPointerOverGameObject()
命名空间 :UnityEngine.EventSystems 官⽅描述: public bool IsPointerOverGameObject(); public bool IsPointerOve ...
基于python+Testlink+Jenkins实现的接⼝⾃动化测试框架V3.0
基于python+Testlink+Jenkins实现的接⼝⾃动化测试框架V3.0 ⽬录 1. 开发环境2. 主要功能逻辑介绍3. 框架功能简介 4. 数据库的创
建 5. 框架模块详细介绍6. Tes ...
查看加密的vba代码
查看加密的vba代码,可以使⽤这个⼯具,excel⽂件⾥⾯的宏代码⼀览⽆余. filesblogs/files/laoxia/PVP.zip
IIS - ⾃动申请、部署Let's Encrypt的免费SSL证书(让⽹站实现HTTPS协议)
IIS - ⾃动申请.部署Let's Encrypt的免费SSL证书(让⽹站实现HTTPS协议) 2017-12-19发布:hangge阅读:161 ⼀.HTTPS 协议介绍 1,什么是 HTTP ...
>php memcached
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论