- 博客(232)
- 资源 (28)
- 收藏
- 关注
原创 Docker 安装与使用
直接使用 宿主机IP + 端口 即可远程登录 MySQL,密码为环境变量配置的 123456。添加环境变量,如:MYSQL_ROOT_PASSWORD。创建一个守护式容器在后台运行,即不进入容器。表示目录映射关系,宿主机目录:容器目录。端口映射,宿主机端口:容器端口。容器启动后会进入其命令行。
2025-11-21 10:04:17
105
原创 容器化技术
早期,大家都认为硬件抽象层基于 hypervisor 的虚拟化方式可以最大程度上提供虚拟化管理的灵活性。各种不同操作系统的虚拟机都能通过 hypervisor 来衍生、运行、销毁。然而,随着时间推移,发现 hypervisor 这种方式麻烦越来越多。因为对于 hypervisor 环境来说,每个虚拟机都需要运行一个完整的操作系统以及其中安装好的大量应用程序。但实际生产开发环境里,我们更关注的是自己部署的应用程序,如果每次部署发布都得搞一个完整操作系统和附带的依赖环境,就显得很繁琐。
2025-11-21 10:03:45
19
原创 MySQL8.0新特性
在5.7及之前的版本,select…当修改一个账户密码时,需要去验证当前的密码,通过参数 password_require_current 来控制,默认关闭,当打开该选项时,如果要修改账户密码,必须要提供当前的密码才允许修改。MySQL 8.0 版本引入了一个新的机制 WriteSet,来追踪事务之间的依赖性,这个特性被用于优化从库应用 binlog 的速度,在主库并发较低的场景下,能够显著提高从库回放 binlog 的速度,基于 WriteSet 的并行复制方案,彻底解决了 MySQL 复制延迟问题。
2025-11-20 09:45:01
260
原创 高性能索引创建策略
对于一个查询而言,一个三星索引,可能是其最好的索引。如果查询使用三星索引,一次查询通常只需要进行一次磁盘随机读以及一次窄索引片的扫描,因此其相应时间通常比使用一个普通索引的响应时间少几个数量级。三星索引概念是在《Rrelational Database Index Design and the optimizers》 一书索引将相关的记录放到一起则获得一星,如果索引中的数据顺序和查找中的排列顺序一致则获得二星,如果索引中的列包含了查询中需要的全部列则获得三星。
2025-11-20 09:44:19
753
原创 MySQL:性能优化
三种调优方法是按照金字塔的调优顺序排列的。一般来说,自底向上调优的效果是成反比的,而越往下层调优效果越好,但是难度也越大。在进行优化时,首先需要关注和优化的应该是架构,如果架构不合理,那么 DBA 能做的事情其实是比较有限的。对于架构调优,在系统设计时首先需要充分考虑业务的实际情况,是否可以把不适合数据库做的事情放到数据仓库、搜索引擎或者缓存中去做;然后考虑写的并发量有多大,是否需要采用分布式;最后考虑读的压力是否很大,是否需要读写分离。对于核心应用或者金融类的应用,需要额外考虑数据安全因素,数据是否不允许
2025-11-19 09:42:47
438
原创 MySQL 成本分析
每个表都维护了一个变量,该变量记录着对该表进行增删改的记录条数,如果发生变动的记录数量超过了表大小的 10%,并且自动重新计算统计数据的功能是打开的,那么服务器会重新进行一次统计数据的计算,并且更新 innodb_table_stats和innodb_index_stats 表。比如对于一个一万行记录的表来说,某个索引列的 Cardinality 属性是 10000,那意味着该列中没有重复的值,如果 Cardinality属性是 1 的话,就意味着该列的值全部是重复的。
2025-11-18 10:54:07
467
原创 InnoDB:事务
当事务的隔离级别为 READ COMMITED 时,虽然解决了脏读的问题,但是如果在 SESSION 1 先查询了一行数据,在这之后 SESSION 2 中修改了同一行数据并且提交了修改,在这时,如果 SESSION 1 中再次使用相同的查询语句,就会发现两次查询的结果不一样。当我们开启了 MySQL 的 bin log 日志,很明显需要保证 bin log 和事务日志的一致性,为了保证二者的一致性,使用了两阶段事务 2PC,所谓的两个阶段是指:第一阶段:准备阶段、第二阶段:提交阶段。
2025-11-18 10:53:30
240
原创 InnoDB:多版本并发控制
MVCC(Multi Version Concurrency Control),多版本并发控制。顾名思义,MVCC 是通过数据行的多个版本管理来实现数据库的并发控制。这项技术使得在 InnoDB 的事务隔离级别下执行一致性读操作有了保证。换言之,就是为了查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值,这样在做查询的时候就不用等待另一个事务释放锁。MySQL 在读已提交和可重复读隔离级别下都实现了 MVCC 机制。
2025-11-17 13:54:16
1425
原创 InnoDB:存储引擎架构
MySQL 的 InnoDB 存储引擎架构,包括了内存架构和磁盘架构两部分。其中,内存架构部分包括:缓冲池(Buffer Pool)、修改缓冲区(Change Buffer)、自适应 hash 索引(Adaptive Hash Index)、日志缓冲区(Log Buffer)。磁盘架构包括:表、索引、表空间、双写缓冲区(Doublewrite Buffer)、重做日志(Redo Log)、撤销日志(Undo Logs)。
2025-11-17 13:53:45
714
原创 mysql中的存储引擎
关系数据库表是用于存储和组织信息的数据结构,有的表简单,有的表复杂,有的表根本不用来存储任何长期的数据,有的表读取时非常快,但是插入数据时却很差。而我们在实际开发过程中,就可能需要各种各样的表。不同的表,就意味着存储不同类型的数据,数据的处理上也会存在着差异。针对这些差异开发出不同的存储引擎,真实数据在不同存储引擎中存放的格式一般是不同的。存储引擎是数据库底层软件组件,数据库管理系统使用存储引擎进行创建、查询、更新和删除数据操作。
2025-11-14 13:53:01
1287
原创 MySQL中的日志
MySQL 在提交事务的时候,不仅仅会将 redo log buffer 中的数据写入到 redo log 文件中,同时也会将本次修改的数据记录到 bin log 文件中,同时会将本次修改的 bin log 文件名和修改的内容在 bin log 中的位置记录到 redo log 中,最后还会在 redo log 最后写入 commit 标记,这样就表示本次事务被成功的提交了。虽然慢查询日志文件是可读的,但是在大量的日志文件中分析我们需要的数据还是有一定难度的,所以我们一般使用工具进行分析。
2025-11-14 13:50:09
669
原创 MySQL 中的锁机制
在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。为保证数据的一致性,需要对并发操作进行控制,因此产生了锁。同时锁机制也为实现MySQL的各个隔离级别提供了保证。锁冲突也是影响数据库并发访问性能的一个重要因素。所以锁对数据库而言显得尤其重要,也更加复杂。
2025-11-04 10:01:42
46
原创 基于查询的优化
先来看一下典型的分页查询它将全表扫描速度会很慢,而且有的数据库结果集返回不稳定(如某次返回 1,2,3;另外的一次返回 2,1,3)。LIMIT 限制的是从结果集的 M 位置处取出 N 条输出,其余抛弃。我们对其进行优化,建立主键或唯一索引,同时利用覆盖索引来加快查询速度这里不适用 id >= 90000 的原因是 id 不一定是自增的,我们无法知道第 90000 行的 id 是什么。进一步优化可以使用。
2025-11-04 10:00:41
164
原创 基于索引的优化
如上图所示,建立一张表并创建二级索引,再执行再来看一下执行计划,可以发现该查询是走了 username 索引的,但是最后的 Extra 为 Using where 表示数据在 server 层还进行了过滤操作。SQL 后面加了 \G 可以把数据用列的形式展示。
2025-10-29 13:49:43
31
原创 Explain执行计划
Explain 被称为执行计划,在语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,模拟 MySQL 优化器来执行 SQL 语句,执行查询时,会返回执行计划的信息,并不执行这条 SQL。注意,如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中。Explain 可以用来分析 SQL 语句和表结构的性能瓶颈。通过 explain 的结果,可以了解到如数据表的查询顺序、数据查询操作的操作类型、哪些索引可以被命中、哪些索引实际会命中、每个数据表有多少行记录被查询等信息。
2025-10-29 13:48:25
80
原创 索引的相关概念
查询包含 f 的记录,包含的查询在 sql 中的写法是 %f%,可以看一下上面的数据,f 在每个页中都存在,我们通过 P1 页中的记录是无法判断包含f的记录在那些页的,只能通过 io 的方式加载所有叶子节点,并且遍历所有记录进行过滤,才可以找到包含 f 的记录。这个时候虽然性能最好,但是也是最费空间的,这不符合我们创建前缀索引的初衷。所以只要我们对某个表建立一个索引,那么它的根节点的页号就会被记录到某个地方,后续只要 InnoDB 需要用这个索引,就会从那个固定的地方取出根节点的页号,从而访问这个索引。
2025-10-29 13:47:16
29
原创 索引的数据结构
我们知道数据页可以组成一个双向链表,而每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表,每个数据页都会为存储在其中的记录生成一个页目录,在通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录。假设目前表中的记录比较少,所有的记录都可以被存放到一个页中,在查找记录的时候可以根据搜索条件的不同分为两种情况,当搜索条件为主键时在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录。
2025-10-29 13:39:04
58
原创 SQL是怎样执行的
即,一个用户成功建立连接后,即使你用管理员账号对这个用户的权限做了修改,也不会影响已经存在连接的权限,只有再新建的连接才将新的权限读入 Session。查询优化器内部具体怎么实现的我们不需要是关心,我们需要知道的是 MySQL 会帮我去使用他自己认为的最好的方式去优化这条 SQL 语句,并生成一条条的执行计划,比如你创建了多个索引,MySQL 会依据成本最小原则来选择使用对应的索引,这里的成本主要包括两个方面, IO 成本和 CPU 成本。这时候如果要继续,就需要重连,然后再执行请求了。
2025-10-29 13:35:34
61
原创 数据库与文件系统
在 MySQL 5.6.6 以及之后的版本中,InnoDB 并不会默认的把各个表的数据存储到系统表空间中,而是为每一个表建立一个独立表空间,也就是说我们创建了多少个表,就有多少个独立表空间。使用独立表空间来存储表数据,会在该表所属数据库对应的子目录下创建一个后缀为 .idb 的文件表示该独立表空间,文件名和表名相同,用于存储数据和索引。默认情况下,InnoDB 会在数据目录下创建一个名为 ibdata1 、大小为 12M 的文件,这个文件就是对应的系统表空间在文件系统上的表示。.frm 存储表结构信息、
2025-10-29 13:35:04
28
原创 JVM常量池
字符串常量池是 JVM 在堆内存中维护的一个全局哈希表,专门缓存通过字面量或方法显式入池的字符串对象。通过缓存字符串对象实现复用:直接赋值的字面量会先查池,存在则返回引用,不存在则新建并缓存,显著减少内存开销和创建性能损耗。
2025-10-29 11:47:06
93
原创 JVM垃圾收集器
JVM 的分代收集是一种基于对象生命周期差异的内存管理策略,它将堆内存划分为新生代、老年代和元空间,并针对不同代采用差异化的垃圾回收机制。在 Java 堆划分出不同的区域之后,垃圾收集器才可以每次只回收其中某一个或者某些部分的区域,因而才有了Minor GCMajor GCFull GC这样的回收类型的划分;也才能够针对不同的区域 安排与里面存储对象存亡特征相匹配的垃圾收集算法。新生代主要存放新创建的对象,分为 Eden 区和两个 Survivor 区,绝大多数对象在这里被快速回收。
2025-10-29 11:45:42
309
原创 JVM 执行引擎
执行引擎是 Java 虚拟机核心组成的一部分,虚拟机是一个相对于物理机的一个概念,这两种机器都有执行代码的能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统的层面上的,而虚拟机的执行引擎是由软件自行实现的,因此可以不受物理条件制约的指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的格式。java虚拟机可以理解成一个抽象的计算机,相较于真正的物理机而言,java 虚拟机的执行效率会略慢于物理机。
2025-10-29 11:44:37
412
原创 JVM 字节码剖析
Java 源代码经过编译器编译后,就会生成 JVM 字节码,它是一种基于栈的低级、中立于平台的指令架构,每个字节码指令都会在 JVM 上执行一系列的操作,如加载、存储、运算、跳转等。它使用基于操作数栈和局部变量表的执行模型。因此,只要在不同平台上安装相应的 JVM,就能在这些平台上运行相同的字节码,这种特性为 Java 程序提供了很高的可移植性和兼容性。值得注意的是,其他编程语言也可以编译成 JVM 字节码,利用 JVM 的优势。这些编程语言叫做基于 JVM 的语言,例如 Kotlin、Groovy 等。
2025-10-29 11:43:33
65
原创 JVM内存分配机制
虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。new 指令对应到语言层面上讲是,new 关键词、对象克隆、对象序列化等。
2025-10-20 17:02:27
168
原创 JVM内存模型剖析
Oracle 有两个 Java 平台标准的产品,Java SE 开发工具包(JDK)和 Java SE 运行时环境(JRE)。(Java Development Kit Java,开发工具包)(jar.exe)(Java Runtime Environment,Java 运行环境)(JVM)(Java Virtual Machine,Java 虚拟机)
2025-10-20 17:01:23
34
原创 Java 类加载机制
得到结果如下图所示:JDK8 中存在两个体系:左侧是 JDK 中实现的类加载器,通过 parent 属性形成父子关系。应用中自定义的类加载器的 parent 都是 AppClassLoader。右侧是 JDK 中的类加载器实现类。通过类继承的机制形成体系。未来我们就可以通过继承相关的类实现自定义类加载器。JDK8 中的类加载器都继承于一个统一的抽象类 ClassLoader,类加载的核心也在这个父类中。核心方法如下:这个方法就是最为核心的双亲委派机制。
2025-10-17 15:28:47
37
原创 全面理解 JAVA 虚拟机
一个 Java 进程会将他管理的内存分为 heap 堆区和 nonheap 非堆区两个部分。其中非堆区的几个核心部分:code_cache(热点指令缓存),metaspace(元空间)(压缩类空间)。这一部分就相当于 Java 进程中的地下室,属于不太活跃的部分。而中间 heap 堆区就相当于客厅了,属于 Java 中最为核心的部分。而这其中,又大体分为了 eden_space(伊甸园)(幸存者)和 old_gen(老年代)三个大的部分,这就是 JVM 内存的主体。
2025-10-17 14:10:40
293
原创 Spring 推断构造方法
Spring 容器在创建 Bean 实例时,会调用类的方法。该方法首先检查 BeanDefinition 是否绑定了 Supplier,或者是否存在工厂方法名。如果这些条件都不满足,Spring 将尝试自动构造 Bean,即调用方法。在方法中,Spring 会检查是否指定了具体的构造方法或构造方法参数值。如果没有,它将找出所有可用的构造方法,并根据参数个数进行排序,优先选择参数个数最多的构造方法。然后,Spring 会遍历每个构造方法,根据参数类型寻找匹配的 Bean。
2025-10-17 14:10:05
42
原创 Spring 循环依赖
A创建时—>需要B---->B去创建—>需要A,此时,A 和 B 均未创建成功,从而产生了循环那么如何打破这个循环,加个缓存,存放实例化后的 Bean(提早暴露,只要放到缓存了,其他Bean需要时就可以从缓存中拿了)(虽然是 A 的原始对象,还不是最终的 Bean)因为整个过程中,都只有一个 A 原始对象,所以对于 B 而言,就算在属性注入时,注入的是 A 原始对象,也没有关系,因为 A 原始对象在后续的生命周期中在堆中没有发生变化。
2025-10-17 14:08:40
169
原创 Bean生命周期
Spring 启动的时候会进行扫描,会先调用扫描某个包路径,并得到 BeanDefinition 的 Set 集合。主要是 ClassPathBeanDefinitionScanner 的 scan 方法.classMetadataReader(在Spring源码中MetadataReader 的具体实现类为 SimpleMetadataReader)metadataReader 判断是不是对应的类是不是接口或抽象类等例如内部类也会生成一个 class 文件,但是不需要创建 BeanDefinition。
2025-10-17 14:07:24
34
原创 Spring 原理剖析
可以看到 AnnotationConfigApplicationContext 的用法和 ClassPathXmlApplicationContext 是非常类似的,只不过需要传入的是一个 class,而不是一个 xml 文件。而 AppConfig.class 和 spring.xml 一样,表示 Spring 的配置,比如可以指定扫描路径,可以直接定义 Bean,比如:spring.xml 中的内容为:所以 spring.xml 和 AppConfig.class 本质上是一样的。
2025-10-17 13:40:28
479
原创 【进击面试_03】Java 并发
1.1 volatile1.1.1 JMM☞ JMM 是什么 JMM(Java 内存模型:Java Memory Model,简称 JMM)本身是一种抽象的概念并不真实存在,它描述的是一组规则或规范,定义了程序中各个共享变量的访问规则,即在虚拟机中将变量存储到内存和从内存读取变量这样的底层细节。 根据 JMM 的设计,系统存在一个主内存(Main Memory),Java 中所有实例变量都储存在主存中,对于所有线程都是共享的。每个线程都有自己的工作内存(Working Memory)是私有数据区
2021-03-02 03:00:44
2681
5
原创 【算法_02】两数相加
给你两个非空 的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0开头。
2021-03-01 22:00:02
451
原创 【算法_01】两数之和
给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出 和为目标值 的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
2021-02-28 04:06:24
403
原创 【进击面试_02】Java 多线程
1.1 基本概念1.1.1 线程与进程 进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创建、运行到消亡的过程。 线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。1.1.2 并行与并发 并发:在操作系统中,安装了多个程序,并发指的是在一段时间内宏观上有
2021-02-26 18:18:32
450
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅