zhoujunlin's blog

莫道君行早, 更有早行人.

06-全局锁和表锁 :给表加个字段怎么有这么多阻碍?.md

全局锁和表锁

数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。 根据加锁的范围,MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类。今天这篇文章,我会和你分享全局锁和表级锁。而关于行锁的内容,我会留着在下一篇文章中再和你详细介绍。 这里需要说明的是,锁的设计比较复杂,这两篇文章不会涉及锁的...

01-谁最便宜就选谁——基于成本的优化

MySQL执行成本

什么是成本 我们之前老说MySQL在执行一个查询时可以有不同的执行方案。它会选择其中成本最低,或者说代价最低的那种方案去真正地执行查询。不过我们之前对成本的描述是非常模糊的,其实一条查询语句在 MySQL 中的执行成本是由两个方面组成的。 I/O成本:我们的表经常使用的 MyISAM、InnoDB 存储引擎都是将数据和索引存储到磁盘上。当查询表中的记录时,需要先把数据或者索引加载到内...

05-深入浅出索引(下)

索引覆盖-最左原则-索引下推

在下面这个表T中,如果我执行 select * from T where k between 3 and 5,需要执行几次树的搜索操作,会扫描多少行? 下面是这个表的初始化语句。 create table T ( ID int primary key, k int NOT NULL DEFAULT 0, s varchar(16) NOT NULL DEFAULT '', ...

04-深入浅出索引(上)

索引

提到数据库索引,我想你并不陌生,在日常工作中会经常接触到。比如某一个SQL查询比较慢,分析完原因之后,你可能就会说“给某个字段加个索引吧”之类的解决方案。但到底什么是索引,索引又是如何工作的呢?今天就让我们一起来聊聊这个话题吧。 数据库索引的内容比较多,我分成了上下两篇文章。索引是数据库系统里面最重要的概念之一,所以我希望你能够耐心看完。在后面的实战文章中,我也会经常引用这两篇文章中提到的...

03-事务隔离:为什么你改了我还看不见?

事务隔离与MVCC

提到事务,你肯定不陌生,和数据库打交道的时候,我们总是会用到事务。最经典的例子就是转账,你要给朋友小王转100块钱,而此时你的银行卡只有100块钱。 转账过程具体到程序里会有一系列的操作,比如查询余额、做加减法、更新余额等,这些操作必须保证是一体的,不然等程序查完之后,还没做减法之前,你这100块钱,完全可以借着这个时间差再查一次,然后再给另外一个朋友转账,如果银行这么整,不就乱了么?这时...

02-日志系统:一条SQL更新语句是如何执行的?

redo和bin log

一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。 那么,一条更新语句的执行流程又是怎样的呢? 之前你可能经常听DBA同事说,MySQL可以恢复到半个月内任意一秒的状态,惊叹的同时,你是不是心中也会不免会好奇,这是怎样做到的呢? 我们还是从一个表的一条更新语句说起,下面是这个表的创建语句,这个表有一个主键ID和一个整型字段c: create ...

01-基础架构:一条SQL查询语句是如何执行的?

一条SQL查询语句是如何执行的?

MySQL基本架构 下面是MySQL的基本架构示意图,从中可以清楚地看到SQL语句在MySQL的各个功能模块中的执行过程。 大体来说,MySQL可以分为Server层和存储引擎层两部分。 Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过...

01-JVM与Java体系结构

write once, run anywhere

前言 你是否也遇到过这些问题? 运行着的线上系统突然卡死,系统无法访问,甚至直接OOM! 想解决线上JVM GC问题,但却无从下手。 新项目上线,对各种JVM参数设置一脸茫然,直接默认吧然后就GG了。 每次面试之前都要重新背一遍JVM的一些原理概念性的东西,然而面试官却经常问你在实际项目中如何调优VM参数,如何解决GC、OOM等问题,一脸懵逼。 大部分Java开发...

02-SpringApplication.run

SpringApplication.run重要流程

事件发布与监听 SpringApplication springApplication = new SpringApplication(); // 添加事件监听器 用于监听到事件回调处理逻辑 springApplication.addListeners(event -> { System.out.println("事件来源: " + event.getClass()); ...

01-new SpringApplication

加载BeanDefinition | 推断应用类型 | 初始化器 | 主类推断

准备配置Bean @Configuration public class TestSpringApplication { static class Bean1 { } static class Bean2 { } static class Bean3 { } @Bean public Bean2 bean2() { ...