MySQL进阶之路
文章平均质量分 89
从零开始学习MySQL内存模型、性能优化、分库分表等进阶知识
生命中有太多不确定
热爱技术,热爱生活。积少成多,不急功近利,from 量变 to 质变
展开
-
MySQL进阶之路(二十一)—— 5分钟搞懂MySQL中的优化器与成本模型
5分钟搞懂MySQL中的优化器与成本模型本文目录5分钟搞懂MySQL中的优化器与成本模型一、概述二、优化器三、成本模型四、成本计算示例1、全表扫描2、使用索引进行回表查询3、多表连接查询五、总结一、概述 在之前的文章中我们学习了SQL的执行计划,通过possible_keys字段可以看得出来一个SQL在执行查询操作的时候有多个索引可供使用的,换句话说就是有很多种方式来完成这次查询。在这种情况下,我们必须要选择一个执行计划来完成查询,正是为了完成执行计划的选择,才有了查询优化器这个东西。本篇文章将会介原创 2021-12-01 16:28:05 · 1567 阅读 · 0 评论 -
MySQL进阶之路(二十)—— 5分钟看懂SQL的执行计划
5分钟看SQL的执行计划一、概述 如果你想优化SQL语句,那么SQL执行计划就是必须要知道的,因为只有通过SQL的执行计划,你才可以知道SQL是如何进行查询的,以及否走索引、用的是什么索引、是否进行了排序又是如何排序的等等信息。 在应用层面其实就是在SQL语句前面加上Explain,我在前面的文章中有涉及到这个的使用,但是没有细说,今天我们专门来讲一讲这个Explain输出的信息都是什么意思二、Explain输出的列列意义id该SELECT标识符select_typ原创 2021-11-19 16:50:27 · 4708 阅读 · 1 评论 -
MySQL进阶之路(十九)—— Order By 和 Group By 优化
Order By 和 Group By 优化文章目录Order By 和 Group By 优化一、Order By 优化示例注意事项小结二、Group By 优化隐式排序与显示排序示例作用三、本篇总结一、Order By 优化 在平时工作中肯定很多地方会需要用到Order By进行排序,比如总是展示最新的数据,这个其实就是按照时间排序,再比如,根据积分等进行排名。等等等等。真的太普遍了。 对于排序,你可能会觉得是不是根据where条件选出一波数据,然后加载到内存中进行排序,又或者是使用一个临时原创 2021-10-31 17:59:19 · 487 阅读 · 0 评论 -
MySQL进阶之路(十八)—— 最常用的索引使用规则
最常用的索引使用规则(干货篇)文章目录最常用的索引使用规则(干货篇)一、概述二、常用规则1、等值匹配规则2、最左匹配规则3、最左前缀匹配规则4、范围匹配规则5、最左匹配规则 + 等值匹配规则 + 范围匹配规则三、小结一、概述 在前面的几篇文章中,详细讲解了索引的原理以及B+树的结构,今天,就这此基础之上来聊聊平时开发中经常可以用到索引的一些地方。这样大家在平时写SQL的时候就会去留意这些点,从而改善查询的性能。 本文种的截图使用到了 Explain,这个是用于分析SQL语句的执行情况的,以后原创 2021-10-30 15:49:20 · 398 阅读 · 0 评论 -
MySQL进阶之路(十七)—— 复合索引及最左匹配原则探究
复合索引及最左匹配原则探究文章目录复合索引及最左匹配原则探究一、概述二、联合索引是长什么样子的?三、如何建立和使用复合索引四、覆盖索引是什么?五、总结一、概述 上一篇文章中介绍了B+树是如何根据索引构造出来的以及如何使用索引去查询数据的,不知道你有没有发现,那些例子都是某一列作为索引,比较好理解,而今天,我们将要说的是多个列组成的索引是什么样子的,以级其使用的规则。二、联合索引是长什么样子的? 如果说只有一个列,那么匹配起来是非常简单的,我们只需要对一个列的值不断地进行比较就可以了,但是如果是原创 2021-10-24 17:28:24 · 278 阅读 · 0 评论 -
MySQL进阶之路(十六)—— 透彻理解InnoDB中的B+树以及回表操作
透彻理解InnoDB中的B+树及回表操作文章目录透彻理解InnoDB中的B+树及回表操作一、概述二、透彻理解B+树之前必需知道的点三、为什么会用B+树来存储?四、B+树到底长什么样?五、那回表查询是什么样的操作?六、小结一、概述 在上一篇文章中详细的介绍了记录和数据页在磁盘上的结构,没有看过的可以点这里去快速把知识补上,今天将在此基础之上以一个更大的视角去探究一下B+树的结构。二、透彻理解B+树之前必需知道的点 1、首先,记录都是存储在数据页中的,并且是通过next指针构成了单链表的结构原创 2021-10-23 17:14:51 · 544 阅读 · 0 评论 -
MySQL进阶之路(十五)—— InnoDB中记录与数据页的结构详解及如何构成B+树
InnoDB中记录与数据页结构及如何构成B+树文章目录InnoDB中记录与数据页结构及如何构成B+树一、概述二、为什么需要BufferPool?三、Buffer Pool中的记录是什么样的结构?1、底层结构2、各个部分的作用FIELD START OFFSETSEXTRA BYTESFIELD CONTENTS四、Buffer Pool中的数据页是什么样的结构?1、底层结构2、各部分的作用File Page HeaderPage HeaderInfimum 和 Supremum 记录User Record原创 2021-10-22 15:55:54 · 346 阅读 · 0 评论 -
MySQL进阶之路(十四)—— InnoDB中的锁是怎样的?一篇搞懂它!
MySQL进阶之路(十四)—— InnoDB中的锁是怎样的?一篇搞懂它!本文目录MySQL进阶之路(十四)—— InnoDB中的锁是怎样的?一篇搞懂它!一、概述二、MySQL中的锁是如何工作的三、MySQL中有哪些锁?**共享锁/排它锁**意向锁记录锁间隙锁Next-Key锁其他锁四、小结一、概述 在上一篇文章中详细介绍了MVCC机制,它解决的是在有其他的事务在更新时如何读的问题,而今天将要介绍的解决的是其他事物在更新时如何更新的问题。其实加锁这一机制不仅仅是在MySQL中,在很多计算机语言中你都能原创 2021-10-19 17:51:19 · 189 阅读 · 0 评论 -
MySQL进阶之路(十三)—— MVCC的原理及意义探究
MySQL进阶之路(十三)—— MVCC的原理及意义探究一、概述 上一篇文章说到了InnoDB引擎的事务的隔离级别,本篇文章将会详细的介绍MVCC机制,涉及到的内容 比较多,但是都不难。 MVCC是 multiversion concurrency control的简写,中文意思是多版本并发控制,该技术允许具有特定隔离级别的InnoDB事务执行一致的读操作;除了可以查询其他事物正在更新的数据之外,还可以查询这些更新发生之前的数据。此技术大大地提高了数据库的并发性,使得查询操作不需要等到其他事物持原创 2021-10-07 20:38:08 · 207 阅读 · 0 评论 -
MySQL进阶之路(十二)——事务的4种隔离级别分别是什么
MySQL进阶之路(十二)——事务的4种隔离级别分别是什么一、概述 在上一篇文章中给大家详细介绍了多个事务并发执行的场景下出现脏写、脏读、不可重复读和幻读的原因,本篇文章将会给大家详细介绍MySQL为了防止上述情况的发生分别是如何去做的 回顾之前所学的,事务具有ACID四种特性,其中 I 指的是事务的隔离性,对于隔离性,又有不同的隔离级别,不同的隔离级别本质上其实是在事务同时进行更改或查询操作时在结果的性能、可靠性、一致性和可再现性之间所作的取舍不同而已。 InnoDB支持的隔离级别有:S原创 2021-10-04 19:42:30 · 152 阅读 · 0 评论 -
MySQL进阶之路(十一)—— 为什么会出现脏写、脏读、不可重复读与幻读
为什么会出现脏写、脏读、不可重复读与幻读一、概述 我们平时的业务系统和数据库的连接并不是单个,一般都会同时有多个线程操作数据库,也就可能会出现多个线程同时操作同一个数据的情况,而且很多操作一般都是以事务的方式进行,可以借助redo log重做或者undo log回滚,如果是单个事务,肯定是没有什么问题的,但是如果是多个事务就会发生一些奇怪的现象。二、脏写是怎么出现的? 现在有事务A和事务B两个事物,他们会操作同一个数据C,A先将C改成了A,然后B又将值改成了B,然后事务B提交了。还记得事务A在原创 2021-09-14 21:26:16 · 1028 阅读 · 5 评论 -
MySQL进阶之路(十)——再探undo log原理
再探undo log原理一、概述 在上一篇文章中我们详细介绍了redo log日志,介绍了redo log的作用、如何实现故障恢复、刷盘策略等,如果有忘记的小伙伴可以点这里快速复习一下。 本篇文章将详细介绍undo log的原理二、undo log的作用 如果学习过前面几篇的文章,就已经知道了undo log的作用——用于事务的回滚。为什么事务需要回滚呢?这就不得不说到事务的ACID原则了,其中的A就是事务的原子性:当一个事物对数据库进行多次更改时,在提交时要么所有的改动都成功,要么在回滚事原创 2021-09-13 16:47:47 · 261 阅读 · 0 评论 -
MySQL进阶之路(九)——深探redo log,原来如此简单
深探redo log,原来如此简单一、回顾 对于redo log在之前的文章将Buffer Pool的时候简单介绍过它的作用。这里我们再来回顾一下: 平时我们在CRUD代码的时候,会不断地对数据库进行操作,数据库会先将数据从磁盘上加载到Buffer Pool的free链表中一个空的缓存页上,之后就基于内存对其进行操作,如果更新了数据页中的某些数据,那么这条数据就会被加如到flush链表和LRU链表中,之后等待后台的IO线程根据LRU链表将脏数据页刷入磁中。我们首先来简单想一下,首先不考虑各种原创 2021-09-08 00:04:40 · 256 阅读 · 0 评论 -
MySQL进阶之路(八)MySql中的数据是如何被存储的?
数据在MySql中是如何被存储的概述 众所周知,数据库中的一条记录对应着表中的一行数据。平时我们通过select查询数据的时候也是一次查一行或者多行,只不过有时候可能查的是某几列的数据。 对于InnoDB引擎而言,它有4中行格式,具体的可以查看MySql官网,其实都大同小异。 可通过下面的方式来指定行格式CREATE TABLE t1 (c1 INT) ROW_FORMAT=COMPACT;varcha类型的数据是如何存储的 数据库中最常见的就是varchar类型了,它和其他原创 2021-06-14 15:34:01 · 244 阅读 · 1 评论 -
MySQL进阶之路(七)Buffer Pool的并发及扩容机制
Buffer Pool的并发性与动态扩容一、MySQL是如何提高并发性的 经过前面文章的学习,现在我们都知道了MySQL在内存中主要是围绕Buffer Pool操作的,当请求比较多的时候,单靠一个线程是肯定不够的,因此,这个一定是多线程的!就向下面这样: 以上面这个图为例,多个线程同时来处理请求并对Buffer Pool进行操作,每当一个线程来对Buffer Pool进行操作的时候,必定会对free链表、flush链表和lru链表加锁,也就是说一次只有一个线程在对Buffer Pool进行操作。原创 2021-05-08 15:21:31 · 323 阅读 · 0 评论 -
MySQL进阶之路(六)Buffer Pool中的LRU链表详解
MySQL之LRU链表详解概述 在上一篇文章中详细讲解了MySQL中BufferPool是什么样的,讲了free链表、flush链表以及lru链表,本篇文章将会着重lru链表。一、预读写机制所造成的缺陷 什么是预读写机制呢?就是你在加载一个数据页到缓存中来的时候,会连带着把相邻的数据页也加载进来,就像下面这样:通过这个图片可能一下看不出来有什么问题,但是如果你想一下这个问题就会发现不对劲的地方假如此时没有空闲的缓存页了,LRU链表需要腾出一些来,此时把尾部的缓存页给刷入磁盘或者清理掉合原创 2021-05-07 15:44:45 · 645 阅读 · 0 评论 -
MySQL进阶之路(五)MySQL中的binlog详解
MySQL中binlog是什么东西?回顾上一篇的内容在上一篇文章中,我介绍了一下InnoDB引擎的架构,还说了三种redo log日志的输盘的策略接下来,我们继续上一讲的内容来探寻一下MySQL中的binlog究竟是什么。binlog是什么?在上一讲里,我们了解了redo log,偏向物理性质,它记录了对哪个数据页的哪个记录进行了个什么修改,是属于InnoDB所特有的,记住,这一点希望大家牢记。而binlog被称为归档日志,里面也记录了所作的操作,不过稍微有点不同的是偏向逻辑性的,类似于原创 2020-12-22 15:41:50 · 336 阅读 · 0 评论 -
MySQL进阶之路(四)InnoDB引擎中的Buffer Pool详解
一次性将MySQL中的Buffer Pool搞懂前期回顾 在前面我们学习了Redo Log日志,它的作用说白了,就是保存你的操作,也许你会有这样的疑惑,为什么就Redo Log有一个Buffer在内存中。Buffer Pol的地位 众所周知,硬盘的速度是非常慢的,而CPU的速度是非常快的,两者的速度天差地别,因此需要固态硬盘作为缓存来缓解两者速度差距过大而出现CPU等待硬盘的情况。所以,对于CPU来说,当它想要对某些数据进行操作的时候,会先把这些数据缓存到内存中,然后在内存中对其进行操原创 2021-04-27 23:24:37 · 1205 阅读 · 5 评论 -
MySQL进阶之路(三)——揭开InnoDB引擎的神秘面纱
大白话扯一扯InnoDB存储引擎架构在探索InnoDB存储引擎之前,我们先来补充几个重要的概念存储引擎是什么? 和大多数的数据库不同, MySQL中有一个存储引擎的概念, 针对不同的存储需求可以选择最优的存储引擎。存储引擎就是存储数据,建立索引,更新查询数据等等技术的实现方式。存储引擎是基于表的,而不是基于库的。所以存储引擎也可被称为表类型。插件是存储引擎是MySQL数据库最重要的特性之一。常见的存储引擎有哪些?InnoDB : 是Mysql的默认存储引擎,用于事务处理应用程序,支持外原创 2020-12-22 14:22:19 · 248 阅读 · 0 评论 -
MySQL进阶之路(二)如何测试数据库性能?
MySQL数据库测压工具这里使用的是sysbench这一工具,用于模拟SQL请求,来对数据库进行测压,并且可以随自己的需求来调整测压时候的参数。工具的安装更新yum repo仓库,否则的可能出现安装失败的情况curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash使用yum进行sysbench的安装//选择下面其中一个即可,第二个是针对权限不原创 2020-12-22 22:33:11 · 1059 阅读 · 2 评论 -
MySQL进阶之路(一)一条SQL语句在MySQL中会经历怎样的过程
SQL语句是如何被执行的?让我们来从头说起写了那么多的CURD,你对SQL的执行流程真的了解吗?如果你对MySQL的认识还是一个黑盒子,那么赶紧和我一起看看在它的里面是如何的为了能够让大部分读者能够理解,我将尽量用大白话来进行解释话不多说,进入正题吧~1、MySQL与客户端进行连接的连接池对于客户端,我们都知道,Java系统与数据库进行连接是借助MySQL驱动来实现的,就像下面这样我们都知道,频繁地建立连接和销毁连接是一件非常消耗系统资源的事,因此,连接池便应运而生了,就像下面这样同原创 2020-11-24 00:17:44 · 286 阅读 · 0 评论