MySQL
文章平均质量分 94
skier~
Java 偏执狂
展开
-
MySQL 一条SQL语句的执行过程
前言在平常的开发中,可能很多人都是 CRUD,对 SQL 语句的语法很熟练,但是说起一条 SQL 语句在 MySQL 中是怎么执行的却浑然不知,今天我就由浅入深,带大家一点点剖析一条 SQL 语句在 MySQL 中是怎么执行的,吊打面试官。本文主要从两个方面,查询语句和更新语句来解析。一条 SQL 查询语句如何执行的比如你执行下面这个 SQL 语句时,我们看到的只是输入一条语句,返回一个结果,却不知道 MySQL 内部的执行过程:mysql> select * from T where ID=原创 2021-12-10 07:47:45 · 703 阅读 · 2 评论 -
深入理解MySQL锁
深入理解MySQL锁对于锁大家应该都不陌生吧,今天我们就来讲讲 MySQL 中的各种锁一、简单介绍一下锁结构吧谈到锁,我们都知道锁的作用,但是我们先来简单讲讲锁的结构吧????????????其实锁就是内存中的一个结构,在我们执行一个事务之前,MySQL表中的记录本来是没有锁的,也就是说一开始是没有锁结构和这条锁记录相关联的,如图所示:但是当一个事务想要对这条记录做改动时,它先到内存中查看有没有与这条记录相关联的锁,如果没有这个锁,就会在内存中生成一个锁结构与这条记录关联,如图:图中表示原创 2021-12-10 07:47:12 · 110 阅读 · 0 评论 -
MySQL BufferPool
我们都知道,MySQL 是基于磁盘存储的数据库,那我们每次查询一个页的记录时都得从磁盘加载整个页进内存然后读取呢,那这样既不是很慢。所以 MySQL 实现了一种叫做 Buffer Pool 的玩意,那 Buffer Pool 是啥玩意呢,我们接着往下看 ????????????一、Buffer Pool其实,Buffer Pool 是 MySQL 服务器向操作系统申请的一片连续的内存区域,我们可以通过 innodb_buffer_pool_size 设置 Buffer Pool 的大小小贴士:inn原创 2021-12-09 22:53:09 · 327 阅读 · 0 评论 -
你还没有搞懂MVCC吗
在讲解 MVCC 之前,我们先简单来复习一下事务的四大特性(ACID):原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;一致性: 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;隔离性: 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;持久性: 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响今天,我们讲解的就是隔离性 ????????????原创 2021-12-09 10:20:29 · 190 阅读 · 0 评论 -
你还不会使用MySQL索引吗
上次我们讲了 MySQL 索引的底层原理,现在我们讲讲如何使用 MySQL 索引吧一、索引的代价空间上的代价每建立一个索引都要为它建立一棵 B+ 树,每一棵 B+ 树的每一个节点都是一个数据页,一个页默认会占用 16KB 的存储空间,一棵很大的 B+ 树由许多数据页组 成,那可是很大的一片存储空间呢,我们可是节约资源的好小孩呢 ????????????时间上的代价每次对表中的数据进行增、删、改操作时,都需要去修改各个 B+ 树索引。而且我们讲过, B+ 树每层节点都是按照索引列的值从小到大的顺序原创 2021-12-09 10:18:35 · 75 阅读 · 0 评论 -
深入浅出 MySQL 索引底层原理
吊打面试官之深入浅出 MySQL 索引底层原理1、前置知识在了解 MySQL 索引的底层原理之前,我们需要知道 MySQL 中数据页的相关知识,知道各个数据页可以组成一个双向链表,而每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表,每个数据页都会为存储在它里边的记录生成一个页目录,在通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录。页和记录的关系示意图如下:页a、页b、页c … 页n可以不在物理结构上相连,只要通原创 2021-12-08 22:56:46 · 164 阅读 · 0 评论 -
Mysql undolog
一、事务回滚的需求我们说过事务需要保证原子性 ,也就是事务中的操作要么全部完成,要么什么也不做。但是偏偏有时候事务执行到一半会出现一些情况,比如:情况一:事务执行过程中可能遇到各种错误,比如服务器本身的错误,操作系统错误,甚至是突然断电导致的错误。情况二:程序员可以在事务执行过程中手动输入 ROLLBACK 语句结束当前的事务的执行。这两种情况都会导致事务执行到一半就结束,但是事务执行过程中可能已经修改了很多东西,为了保证事务的原子性,我们需要把东西改回原先的样子,这个过程就称之为 回滚 (英文原创 2021-12-08 22:56:10 · 151 阅读 · 0 评论 -
MySQL redolog
不知道大家是否还记得事务的四大特性,现在我们回忆一下吧,持久性、一致性、隔离性、原子性。没错,我们今天讲的就是持久性。一、啥是 redo log我们想象有这么一个生产环境,就是如果我们只在内存的 Buffer Pool 中修改了页面,事务提交后突然发生了某个故障,导致内存中的数据都失效了,那么这个已经提交了的事务对数据库中所做的更改也就跟着丢失了,这你能忍?反正我是不能忍。???????????? 这就是持久性遭到了破坏,那我们如何保证持久性呢? 有同学可能说每次事务提交之前把该事务所修改的所有页面都刷原创 2021-12-08 12:57:21 · 426 阅读 · 0 评论 -
MySQL事务
废话不多说,今天我们来讲解 MySQL 的事务吧 ????????????一、事务的概念那到底何为事务呢?我们把需要保证 原子性 、隔离性、 一致性 和 持久性 的一个或多个数据库操作称之为一个事务它大致分为如下几个状态:活动的(active)事务对应的数据库操作正在执行过程中时,我们就说该事务处在 活动的 状态。部分提交的(partially committed)当事务中的最后一个操作执行完成,但由于操作都在内存中执行,所造成的影响并没有刷新到磁盘时,我们就说该事务处在 部分提交的 状态原创 2021-12-08 12:55:59 · 149 阅读 · 0 评论 -
MySQL 笔记
一、数据库驱动二、sql 语句执行过程三、InnoDB 储存引擎的架构设计redo(重做日志)日志刷盘策略的选择建议 :建议的设置为1,也就是说,提交事务的时候,redo 日志必须是刷入磁盘文件的,这样可以严格保证提交事务之后,数据是绝对不会丢失的,因为有 redo 日志在磁盘文件里可以恢复你做的所有修改如果要是选择 0 的话,可能你提交事务之后,MySQL 宕机,那么此时 redo 日志没有刷盘,导致内存里的 redo 日志丢失,你提交的事务更新的数据就丢失了;如果要是选择 2的话原创 2021-12-07 15:11:56 · 100 阅读 · 0 评论 -
一条SQL语句的执行过程
前言在平常的开发中,可能很多人都是 CRUD,对 SQL 语句的语法很熟练,但是说起一条 SQL 语句在 MySQL 中是怎么执行的却浑然不知,今天我就由浅入深,带大家一点点剖析一条 SQL 语句在 MySQL 中是怎么执行的,吊打面试官。本文主要从两个方面,查询语句和更新语句来解析。一条 SQL 查询语句如何执行的比如你执行下面这个 SQL 语句时,我们看到的只是输入一条语句,返回一个结果,却不知道 MySQL 内部的执行过程:mysql> select * from T where ID=原创 2021-11-14 07:58:08 · 1109 阅读 · 0 评论 -
深入理解MySQL锁
深入理解MySQL锁对于锁大家应该都不陌生吧,今天我们就来讲讲 MySQL 中的各种锁一、简单介绍一下锁结构吧谈到锁,我们都知道锁的作用,但是我们先来简单讲讲锁的结构吧????????????其实锁就是内存中的一个结构,在我们执行一个事务之前,MySQL表中的记录本来是没有锁的,也就是说一开始是没有锁结构和这条锁记录相关联的,如图所示:但是当一个事务想要对这条记录做改动时,它先到内存中查看有没有与这条记录相关联的锁,如果没有这个锁,就会在内存中生成一个锁结构与这条记录关联,如图:图中表示原创 2021-11-12 07:29:33 · 107 阅读 · 0 评论 -
啥?你还没有搞懂 Buffer Pool
我们都知道,MySQL 是基于磁盘存储的数据库,那我们每次查询一个页的记录时都得从磁盘加载整个页进内存然后读取呢,那这样既不是很慢。所以 MySQL 实现了一种叫做 Buffer Pool 的玩意,那 Buffer Pool 是啥玩意呢,我们接着往下看 ????????????一、Buffer Pool其实,Buffer Pool 是 MySQL 服务器向操作系统申请的一片连续的内存区域,我们可以通过 innodb_buffer_pool_size 设置 Buffer Pool 的大小小贴士:inn原创 2021-11-11 12:47:44 · 127 阅读 · 0 评论 -
你还没有搞懂MVCC吗
在讲解 MVCC 之前,我们先简单来复习一下事务的四大特性(ACID):原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;一致性: 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;隔离性: 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;持久性: 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响今天,我们讲解的就是隔离性 ????????????原创 2021-11-10 16:54:06 · 144 阅读 · 0 评论 -
你还不会使用MySQL索引吗
上次我们讲了 MySQL 索引的底层原理,现在我们讲讲如何使用 MySQL 索引吧一、索引的代价空间上的代价每建立一个索引都要为它建立一棵 B+ 树,每一棵 B+ 树的每一个节点都是一个数据页,一个页默认会占用 16KB 的存储空间,一棵很大的 B+ 树由许多数据页组 成,那可是很大的一片存储空间呢,我们可是节约资源的好小孩呢 ????????????时间上的代价每次对表中的数据进行增、删、改操作时,都需要去修改各个 B+ 树索引。而且我们讲过, B+ 树每层节点都是按照索引列的值从小到大的顺序原创 2021-11-08 19:36:13 · 88 阅读 · 0 评论 -
吊打面试官之深入浅出 MySQL 索引底层原理
吊打面试官之深入浅出 MySQL 索引底层原理1、前置知识在了解 MySQL 索引的底层原理之前,我们需要知道 MySQL 中数据页的相关知识,知道各个数据页可以组成一个双向链表,而每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表,每个数据页都会为存储在它里边的记录生成一个页目录,在通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录。页和记录的关系示意图如下:页a、页b、页c … 页n可以不在物理结构上相连,只要通原创 2021-11-07 19:34:29 · 98 阅读 · 0 评论 -
MySQL undo log 看这篇就够了
一、事务回滚的需求我们说过事务需要保证原子性 ,也就是事务中的操作要么全部完成,要么什么也不做。但是偏偏有时候事务执行到一半会出现一些情况,比如:情况一:事务执行过程中可能遇到各种错误,比如服务器本身的错误,操作系统错误,甚至是突然断电导致的错误。情况二:程序员可以在事务执行过程中手动输入 ROLLBACK 语句结束当前的事务的执行。这两种情况都会导致事务执行到一半就结束,但是事务执行过程中可能已经修改了很多东西,为了保证事务的原子性,我们需要把东西改回原先的样子,这个过程就称之为 回滚 (英文原创 2021-11-06 20:01:32 · 1968 阅读 · 1 评论 -
深入浅出 MySQLredo log
不知道大家是否还记得事务的四大特性,现在我们回忆一下吧,持久性、一致性、隔离性、原子性。没错,我们今天讲的就是持久性。一、啥是 redo log我们想象有这么一个生产环境,就是如果我们只在内存的 Buffer Pool 中修改了页面,事务提交后突然发生了某个故障,导致内存中的数据都失效了,那么这个已经提交了的事务对数据库中所做的更改也就跟着丢失了,这你能忍?反正我是不能忍。???????????? 这就是持久性遭到了破坏,那我们如何保证持久性呢? 有同学可能说每次事务提交之前把该事务所修改的所有页面都刷原创 2021-11-05 08:22:59 · 459 阅读 · 0 评论 -
MySQL事务
废话不多说,今天我们来讲解 MySQL 的事务吧 ????????????一、事务的概念那到底何为事务呢?我们把需要保证 原子性 、隔离性、 一致性 和 持久性 的一个或多个数据库操作称之为一个事务它大致分为如下几个状态:活动的(active)事务对应的数据库操作正在执行过程中时,我们就说该事务处在 活动的 状态。部分提交的(partially committed)当事务中的最后一个操作执行完成,但由于操作都在内存中执行,所造成的影响并没有刷新到磁盘时,我们就说该事务处在 部分提交的 状态原创 2021-11-04 08:57:22 · 100 阅读 · 0 评论 -
一文让你搞懂 MySQL
一、数据库驱动二、sql 语句执行过程三、InnoDB 储存引擎的架构设计redo(重做日志)日志刷盘策略的选择建议 :建议的设置为1,也就是说,提交事务的时候,redo 日志必须是刷入磁盘文件的,这样可以严格保证提交事务之后,数据是绝对不会丢失的,因为有 redo 日志在磁盘文件里可以恢复你做的所有修改如果要是选择 0 的话,可能你提交事务之后,MySQL 宕机,那么此时 redo 日志没有刷盘,导致内存里的 redo 日志丢失,你提交的事务更新的数据就丢失了;如果要是选择 2的话原创 2021-11-02 21:44:22 · 300 阅读 · 0 评论