MySQL高级 知识拓展

数据量 和 B+Tree 的关系

参考链接

事务隔离级别底层原理 MVCC

参考链接

唯一索引和普通索引的关键不同点

两者区别

查询角度来说:

  • 普通索引查到符合条件的项后还有继续查找下一项,如果下一项不符合条件才返回
  • 唯一索引则时查到符合条件的项后就直接返回

更新角度来说:

  • 先介绍一下 change buffer

    • 它是用来记录更新操作的一种行为,在没有把数据项从硬盘读取到内存中时,进行更新操作会先将操作记录到 change buffer 中;
    • 在下一次进行查询操作时再把数据项读取到内存中,此时才对数据项执行 change buffer 中的命令,这个过程也称之为 merge。
  • 普通索引更新时往往将操作记录到 change buffer 中,在以下进行查询操作时在执行这些更新操作,这样可以减少磁盘与内存的 IO,而从提高效率
  • 唯一索引更新时会首先判断操作的项是否在数据库表中,往往这个时候就会把数据从磁盘读取到内存,所以唯一索引是不适用 change buffer 的

如何选择

大的结论是如果业务能够保证唯一性应该尽量选择普通索引而不是唯一索引。当然如果是那种更新完了就要立马查询的,这种是不推荐使用普通索引的,因为会频繁的产生 merge 操作,change buffer 也需要额外空间来维护的,这样反而误用了 change buffer。

MRR

MRR,全称 Multi-Range Read Optimization,多范围读优化。简单的说,就是 MRR 通过把 随机磁盘读,转换为 顺序磁盘读,从而提高索引查询的性能。

为什么要把随机读转换为顺序读?它们之间是怎么转换的?为什么顺序读能提升性能?带着这素质三问去学习~

总的来说,顺序读带来了几个好处:

  • 磁盘和磁头不再需要来回做机械运动;
  • 可以充分利用磁盘预读
  • 在一次查询中,每一页的数据只会从磁盘读取一次;

索引本身就是为了减少磁盘 IO,加快查询,而 MRR,则是把索引减少磁盘 IO 的作用,进一步放大。

推荐阅读

练习和总结

推荐阅读

推荐阅读

【MySQL 高级】知识拓展的更多相关文章

  1. MySQL高级知识(十六)——小表驱动大表

    前言:本来小表驱动大表的知识应该在前面就讲解的,但是由于之前并没有学习数据批量插入,因此将其放在这里.在查询的优化中永远小表驱动大表. 1.为什么要小表驱动大表呢 类似循环嵌套 for(int i=5 ...

  2. MySQL高级知识(十五)——主从复制

    前言:本章主要讲解MySQL主从复制的操作步骤.由于环境限制,主机使用Windows环境,从机使用用Linux环境.另外MySQL的版本最好一致,笔者采用的MySQL5.7.22版本,具体安装过程请查 ...

  3. MySQL高级知识(十四)——行锁

    前言:前面学习了表锁的相关知识,本篇主要介绍行锁的相关知识.行锁偏向InnoDB存储引擎,开销大,加锁慢,会出现死锁,锁定粒度小,发生锁冲突的概率低,但并发度高. 0.准备 #1.创建相关测试表tb_ ...

  4. MySQL高级知识(十三)——表锁

    前言:锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算机资源(如CPU.RAM.I/O等)的争用外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是 ...

  5. MySQL高级知识系列目录

    MySQL高级知识(一)——基础 MySQL高级知识(二)——Join查询 MySQL高级知识(三)——索引 MySQL高级知识(四)——Explain MySQL高级知识(五)——索引分析 MySQ ...

  6. MySQL高级知识(十二)——全局查询日志

    前言:全局查询日志用于保存所有的sql执行记录,该功能主要用于测试环境,在生产环境中永远不要开启该功能. 1.如何开启 #1.通过my.cnf配置开启该功能. 注:对my.cnf文件配置后,需重启my ...

  7. MySQL高级知识(十一)——Show Profile

    前言:Show Profile是mysql提供的可以用来分析当前会话中sql语句执行的资源消耗情况的工具,可用于sql调优的测量.默认情况下处于关闭状态,并保存最近15次的运行结果. 1.分析步骤 # ...

  8. MySQL高级知识(十)——批量插入数据脚本

    前言:使用脚本进行大数据量的批量插入,对特定情况下测试数据集的建立非常有用. 0.准备 #1.创建tb_dept_bigdata(部门表). create table tb_dept_bigdata( ...

  9. MySQL高级知识(九)——慢查询日志

    前言:慢查询日志是MySQL提供的一种日志记录,它记录MySQL中响应时间超过阈值的语句,具体指运行时间超过long_query_time值的sql语句,该sql语句会被记录到慢查询日志中.慢查询日志 ...

  10. MySQL高级知识(八)——ORDER BY优化

    前言:在使用order by时,经常出现Using filesort,因此对于此类sql语句需尽力优化,使其尽量使用Using index. 0.准备 #1.创建test表. drop table i ...

随机推荐

  1. 题解-Cats Transport

    题解-Cats Transport Cats Transport 有 \(n\) 个山丘,\(m\) 只猫子,\(p\) 只铲屎官.第 \(i-1\) 个山丘到第 \(i\) 个山丘的距离是 \(d_ ...

  2. uniapp图片转base64

    直接上代码了,网上也很多一样的,这里记录下,因为仅仅第二种在真机微信小程序上我这里测试转换失败,所以就一并写在这里了: //图片转base64 urlTobase64(url){ // #ifdef ...

  3. 基于Python3.7 Robot Framework自动化框架搭建

    一.Robot Framework 和 Selenium 的区别(面试常问) 主流自动化测试框架有Robot Framework 和 Selenium,请根据实际场景选用不同的框架,以下总结各自优缺点 ...

  4. maven-assembly-plugin插件打jar包时排出指定的依赖

    pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  5. Java读取系统默认时区

    工作中,遇到一个Java读取默认时区的问题,后来看了openjdk的源码,大致整理一下过程 public class Test { public void test(){ TimeZone.getDe ...

  6. uwsgi 的app变量名称必须为application

    from myproject import app as application if __name__ == "__main__": application.run() 否则会提 ...

  7. Web服务器-并发服务器-协程 (3.4.2)

    @ 目录 1.分析 2.代码 关于作者 1.分析 随着网站的用户量越来愈多,通过多进程多线程的会力不从心 使用协程可以缓解这一问题 只要使用gevent实现 2.代码 from socket impo ...

  8. burpsuite无法拦截本地流量

    参考文章链接:https://blog.csdn.net/tb_youth/article/details/103436796?utm_medium=distribute.pc_relevant.no ...

  9. python爬虫爬取安居客并进行简单数据分析

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 爬取过程一.指定爬取数据二.设置请求头防止反爬三.分析页面并且与网页源码进行比对四.分析页面整理数据 ...

  10. python线性回归

    一.理论基础 1.回归公式 对于单元的线性回归,我们有:f(x) = kx + b 的方程(k代表权重,b代表截距). 对于多元线性回归,我们有: 或者为了简化,干脆将b视为k0·x0,,其中k0为1 ...