目录

基础部分

外键约束

数据库三范式

多表关联查询(重点)

外链接

联合查询(很少用)

分组查询

Having分组过滤

子查询

JDBC

JDBC中如何设置事务隔离级别

应用篇

池化思想之数据库连接池

自己实现简易Java连接池

多数据源

索引

SQL技巧

MySQL的limit到底应该怎么优化


基础部分

varchar(N)长度并不是越长,越好,需要选择一个合适的长度。

因为:在内存中的操作方式,varchar也是按照最长的方式在内存中进行操作的。比如说要进行排序的时候,varcahr(100)是按照100这个长度来进行的,不合理的长度会浪费内存空间

对与大文件,大字符串就没有必要直接存在数据库里面了,因为数据库总的来说是比较慢的

对于大字符串,完全可以把它放入一个文件中,然后把文件的存放路径存到数据库里面,我们通过路径去直接定位文件

大字符串,放在数据库字段中,字符串匹配也是一个麻烦事儿

所以总结下来,字符串类型就用varchar和char就够了,一般不用text和blob

对于名字等短小的字符串,可以使用like "%宝%",这样的模糊查询;如果是像小说这种长的就不适合用模糊查询了,非常慢;长的文本查询要用ES,非常快,毫秒级;

外键约束

外键的目的:

加外键,是为了降低数据冗余,

把外键加到多的一方,是为了把冗余数据降到最低;

外键约束的作用:

为了防止黑户出现,比如电影表中,出现电影类型表中没有的电影类型的电影

关系型数据库,从来只能降低冗余,而不能把冗余完全消除;

数据库三范式

这个三范式有点过时, 一范式可以遵守,二三可以违反

最终,分不分开,还是要看业务需求,如果你有明确的查询需求,就分开,否则不分开也没啥;

实际上二范式,讲的就是多对多关系,出现冗余数据的问题(只有复合主键,才有可能出现非主键列只依赖主键的一部分的情况)

二范式,就是针对复合主键的,如果没有复合主键,也就根本不可能违反二范式了;

解决方案,就是把复合主键,放在第3张表,关系表中;

所以,第三范式,实际上讲的就是,将的一对多的情况,应该继续拆出一张多的表;

有的时候,我们宁可冗余,从而减少表连接查询,所以很多公司都表示可以进行冗余数据,存储空间很大,速度优先是第一位的;所以,阿里巴巴才会禁止表连接查询;

比如,我们直接把电影类型,冗余进电影表中,这样想知道每个电影的类型时,就不用再进行表连接了,这就叫牺牲空间换时间;

所以,现在三范式有点过时, 一范式可以遵守,二三可以违反

多表关联查询(重点)

关联查询时,首先要选好查询主表

怎么选择主表,就看那个表中有你需要的最主要的信息,其余的辅助的信息就通过和主表关联查询出来就好;比如,用户喜欢哪些类型,就在u_c表中,类型名等辅助信息,就通过u_c表关联类型表就好;

早期mysql版本这种方式是,先笛卡尔积一个大表在内存中,然后在内存中,再进行条件过滤(但是现在的新版本,也改成内连接的模式了)

而Join on内连接,是一边拼接,一边过滤,所以不会耗费太多内存;

总之,养成好习惯,尽量使用内连接,不要使用笛卡尔积查询

外链接

这个的作用就是为了做报表时,数据能齐全一些;

内连接是发现条件不成立时,就赶尽杀绝;外连接就是就算条件不成立,也会保留左表或者右表;

联合查询(很少用)

就是求,交、并、差集

Union,是求并集,会去重;Union all,是求并集,不去重;

联合查询用的不多,还不如条件时,用个或OR 条件,来求并集;

分组查询

聚合函数作用在列名上时,不计算null,null不进行统计直接跳过

面试题:

count(1)会统计null值,所以统计行数,不建议写count(列表),而使用count(1)

where要写在group by的前面,表示的含义是:满足这个where条件的记录,才有资格参加接下来的分组;

普通的查询,只能先分组,再对每个组通过聚合函数得到的整体数据,进行排序

Having分组过滤

订单表是多组 多对多关系的合成表

含义是:哪个员工,给哪个用户,卖了哪部电影,卖了多少张;

聚合函数只能用在3个地方:字段列表中,order by后面,having后面;

where是一行行过滤,不能聚合

having是一组一组过滤,能使用聚合函数

子查询

标量子查询

这里,是子查询查出值后,再作为外层父查询的条件值,一行一行过滤父查询中不满足条件的每一行;

列子查询

这是两种解法

行子查询

 这是标量子查询的写法

行子查询用得少,大部分人都用上面的标量子查询替代;

表子查询(重点)

俗称:套娃

 

再以上面这个查询的结果,作为“新表”,对这个新表通过员工id再进行分组

总结:

当想对一个分组的结果,再进行分组时,就只能使用表子查询,别无他法;

上面是方法一

下面是方法二

推荐使用方法二,因为方法一是以父查询做驱动,执行父查询的一行都要执行一次子查询;

JDBC

任何两个程序之间,只要有通信,那么之间就一定会有协议/标准,有了协议就能够实现解耦;

浏览器和服务器之间通信,就有http协议,有了http协议就能够实现浏览器与服务器的解耦,不论使用什么类型的浏览器,服务器都只管接收http格式的请求就好;

JDBC就是java程序和数据库程序之间通信的协议/标准;有了JDBC协议,就让java程序有了统一访问的能力,访问任何数据库都只针对jdbc接口编程,从而实现解耦与统一访问;

这也是一种依赖倒置的思想,加中间接口层,实现上下层的依赖解耦;

java程序和数据库之间,既是通过jdbc协议分开的,但也是通过jdbc协议沟通的;

什么是JDBC?JDBC是Java DataBase Connectivity的缩写,它是Java程序访问数据库的标准接口

使用Java程序访问数据库时,Java代码并不是直接通过TCP连接去访问数据库,而是通过JDBC接口来访问,而JDBC接口则通过JDBC驱动来实现真正对数据库的访问。

例如,我们在Java代码中如果要访问MySQL,那么必须编写代码操作JDBC接口。注意到JDBC接口是Java标准库自带的,所以可以直接编译。而具体的JDBC驱动是由数据库厂商提供的,例如,MySQL的JDBC驱动由Oracle提供。因此,访问某个具体的数据库,我们只需要引入该厂商提供的JDBC驱动,就可以通过JDBC接口来访问,这样保证了Java程序编写的是一套数据库访问代码,却可以访问各种不同的数据库,因为他们都提供了标准的JDBC驱动:

┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐│  ┌───────────────┐  ││   Java App    │
│  └───────────────┘  ││
│          ▼          │┌───────────────┐
│  │JDBC Interface │<─┼─── JDK└───────────────┘
│          │          │▼
│  ┌───────────────┐  ││  JDBC Driver  │<───── Vendor
│  └───────────────┘  ││
└ ─ ─ ─ ─ ─│─ ─ ─ ─ ─ ┘▼┌───────────────┐│   Database    │└───────────────┘

从代码来看,Java标准库自带的JDBC接口其实就是定义了一组接口,而某个具体的JDBC驱动其实就是实现了这些接口的类:

┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐│  ┌───────────────┐  ││   Java App    │
│  └───────────────┘  ││
│          ▼          │┌───────────────┐
│  │JDBC Interface │<─┼─── JDK└───────────────┘
│          │          │▼
│  ┌───────────────┐  ││ MySQL Driver  │<───── Oracle
│  └───────────────┘  ││
└ ─ ─ ─ ─ ─│─ ─ ─ ─ ─ ┘▼┌───────────────┐│     MySQL     │└───────────────┘

实际上,一个MySQL的JDBC的驱动就是一个jar包,它本身也是纯Java编写的。我们自己编写的代码只需要引用Java标准库提供的java.sql包下面的相关接口,由此再间接地通过MySQL驱动的jar包通过网络访问MySQL服务器,所有复杂的网络通讯都被封装到JDBC驱动中,因此,Java程序本身只需要引入一个MySQL驱动的jar包就可以正常访问MySQL服务器:

┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐┌───────────────┐
│  │   App.class   │  │└───────────────┘
│          │          │▼
│  ┌───────────────┐  ││  java.sql.*   │
│  └───────────────┘  ││
│          ▼          │┌───────────────┐     TCP    ┌───────────────┐
│  │ mysql-xxx.jar │──┼────────>│     MySQL     │└───────────────┘            └───────────────┘
└ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘JVM

mysql-xxx-driver.jar就是实现了jdbc的那一系列接口;

使用JDBC的好处是:

  • 各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发;

  • Java程序编译期仅依赖java.sql包,不依赖具体数据库的jar包;

  • 可随时替换底层数据库,访问数据库的Java代码基本不变。

Connection是连接,通过Connection拿到这个连接上的Statement,Statement就是车, sql就是货物,Statement车,就是在连接上,运送 sql这个货物,sql执行完后,车再把执行结果运回来,所以我们拿sql执行结果也是找Statement车拿;

sql注入

预防sql注入,就用preparedStatement替代Statement

 jdbc中操作日期,只能使用java.sql.Date

为什么preparedStatement可以防止sql注入?

 

设计思想:

1. 不要帮用户做决定

2. 无论下层什么存储结构,都给上层返回统一的数据结构

第3点,如果我们的下层存储使用的不是数据库,那么上层也就无法接收ResultSet,但是无论底层存储是文件还是数据库还是其他,我们给上层调用者都返回List,从而就实现了上层与下层存储结构的解耦;

这个时候,上层就是面向对象编程了,上层只需要调用Dao方法就好了,不用再写sql或者关注Dao层是如何实现的了;

不用关注Dao层是直接用的jdbc还是mybatis,还会jpa等等;

代码中,要尽量避免魔法数字,尽量用常量单词代替;

JDBC中如何设置事务隔离级别

读未提交隔离级别:

就是线程T1开始了事务,并修改了表记录,但是T1还没提交事务、

此时,线程T2去读取表,就会读到T1修改了但是还未提交的哪些表记录

转账事务操作

现在是使用的笨办法,

后面可以使用ThreadLocal得同一个线程内的两个不同的方法,可以获取到同一个Connection对象,从而使得同一个线程内的两个不同的方法,有共享同一个事务的机会;

不要使用字符串来保存日期数据,字符串占用空间大,损失日期类型函数的便捷性,比如日期类型可以直接加减日期

如何做sql监控

分表是因为单表过大导致查询索引过慢,

分库是受限于物理单机的性能导致可用连接数有上限。

至于分表,分库还是分表分库要看到底遇到了上面哪种情况。

三层的索引节点,就能指向10E左右的叶子节点,每个叶子节点存2跳数据,也就是4层,就有20E数据

一版,默认一个数据块,能方1000个指针

mysql索引:10亿条数据,索引查询到底有多快?_哔哩哔哩_bilibili

【IT老齐007】为什么大厂在大表做水平分表时严禁使用自增主键

1. 区间分区,会造成单机压力,尾部热点问题

2. uuid作主键会造成索引重排

3. 分布式环境,用雪花算法生成id

uuid还有一个缺点,就是128,太长了

应用篇

池化思想之数据库连接池

池化思想是一种提升系统性能的方式,连接池、线程池…这些池化技术的核心思想就是 空间换取时间

数据库连接的声明周期

 

主要说下当当前连接数为最大连接数时的两步操作,一共设计了两种等待方式,根据传的 计量时间(timeout_ms) 来判断,

如果timeout_ms<=0,则表明我选择死等的方式,即一直阻塞等待,止到有空闲连接为止
否则timeout_ms>0,则表示等待阻塞这么长时间,如果超过了这么长时间,还没有空闲连接,直接返回NULL即可

DataSource 是自 JDK 1.4 提供的一个标准接口,用于获取访问物理数据库的 Connection 对象。

JDK 不提供其具体实现,而它的实现来源于各个第三方驱动程序供应商或数据库访问框架,例如 Spring JDBC、Tomcat JDBC、MyBatis、Druid、C3P0、Seata 等。

public interface DataSource extends CommonDataSource, Wrapper {Connection getConnection() throws SQLException;Connection getConnection(String username, String password) throws SQLException;
}

inner就是真正的MySQL的数据库连接对象,NewProxyConnection实际上是inner的代理

这里还可以多设置一个最小连接数为1或者0

close一个connection也不是真的关闭,而是把它还回了连接池

注意:

如果连接池中设置最大连接数为1,第一次请求用完连接后没有close(),那么第二次请求就在连接池中拿不到连接,那么当前线程就会一直处在一个等待状态

参考链接:

DataSource接口,一个被大多数程序员忽略的接口_马称同学的博客-CSDN博客_datasource接口

讲述了使用 DataSource 比 DriverManager获取数据库连接的好处

自己实现简易Java连接池

学习几点:

  • DataSourse接口和Connection接口的作用
  • 用装饰器模式封装Mysql原装的Connection接口实现类的close()方法
  • 用jdk动态代理封装Mysql原装的Connection接口实现类的close()方法
  • 体会jdk动态代理比装饰器模式优越的点:动态代理我们只需要只关注目标类的目标方法本身,目标类的其他方法不用管,比装饰设计模式更加地简洁

参考链接:如何使用动态代理,自己写一个数据库连接池?

首先纠正一个常见的误解。IO多路复用听上去好像是多个数据可以共享一个IO(socket连接),实际上并非如此。「IO多路复用不是指多个服务共享一个连接,而仅仅是指多个连接的管理可以在同一进程」 。在网络服务中,IO多路复用起的作用是「一次性把多个连接的事件通知业务代码处理」 。至于这些事件的处理方式,到底是业务代码循环着处理、丢到队列里,还是交给线程池处理,由业务代码决定。

参考链接:面试官:为什么数据库连接池不采用 IO 多路复用?

总结一下。DB 访问一般采用连接池这种现象是生态造成的。历史上的 BIO + 连接池的做法经过多年的发展,已经解决了主要的问题。在 Java 的大环境下,这个方案是非常靠谱的,成熟的。而基于 IO 多路复用的方式尽管在性能上可能有优势,但是其对整个程序的代码结构要求过多,过于复杂。当然,如果有特定的需要,希望使用 IO 多路复用管理 DB 连接,是完全可行的。

多数据源

SpringBoot多数据源:动态数据源 - hanease - 博客园

在应用程序中配置多个DataSource也有配置了多个数据源

动态数据源
实现动态数据源的关键点在于需要实现一个 DataSource,支持在 getConnection 方法调用时,能够取到需要的数据源 Connection 对象。

根据此业务场景 Spring 框架在早期 2.0 版的时候提供了一个 AbstractRoutingDataSource 抽象类(建议阅读该类源码),开发者可对其实现抽象方法,来实现动态数据源切换

读写分离
可以在动态数据源的基础上实现读写分离,在读操作和写操作方法上设置不同的 AOP 切面进行 DataSource 切换,进而实现读和写拿到不同的数据源 Connection 对象。

除编程方式实现读写分离外,还有分布式数据库中间件,通过判断 SQL 同样能实现读写分离,例如:ShardingSphere、Mycat、Cobar

索引

索引是一种“排好序”的数据结构

索引数据结构

•二叉树 •红黑树 •Hash表 •B-Tree

操作系统一页4k,innodb存储引擎一页16k,innodb使用页的概念,很好的提高了磁盘读取的效率, 不然就会读一行就需要一次磁盘io,现在多行都在同一页上,只需要一次磁盘io。 操作系统弄出页的概念,也是为了提高读取磁盘的效率,也便于更好的管理磁盘

B树和B+树区别

B树叶子结点只有部分数据,B树需要非叶子节点 + 叶子节点一起才是整张表完整的数据

B树的叶子节点之间是没有指针相连的,从而B树对于范围查询的效率不如B+树

两层的b+树比较好,3层也还行,如果4层就需要分库分表了, 三层至少可以存2000w行以上了

算法:上图的小白框就是一个指针,一个指针指向一个块,一个指针6字节、一个int4字节,一个指针6字节,所以一页可以存16k/10b ,等于1638个对,能指向1638个页

一个B+树加叶子节点3层的结构就能存2000w级别的数据

B+树相对于B树,存储同样数据量的数据,B+树的高度会更低,这是为什么最终存储索引结构选择B+树的原因

从叶子结点,从左往右叫全表扫描, 从上往下检索叫走索引

主键索引的叶子结点存全部数据,普通索引的叶子结点存的是当前索引值+主键值

a字段走索引,找a大于或者小于6都能走索引,第一步会先找到a等于6,然后因为叶子结点是双向链表,所以范围查找很方便

普通索引的范围查找,有可能会导致索引失效,当数据库认为当前走全表扫描,比走普通索引+ 回表,要快时,就会走全表扫描,此时索引就失效了

因为mysiam索引文件和数据文件是分开的,所以通过索引文件定位到某条记录的地址后,还要去读取数据文件才能拿到真正的数据,所以速度肯定比innodb慢

b➕树,叶子结点是含有全部数据:叶子结点对应的页是数据页,叶子结点页的上面几层全是索引页,两者聚集在一起所以引主键索引又叫聚集索引

聚集索引:数据和索引放在一起的,在同一个文件中,索引和数据都是按照一定的顺序存放的。

聚集索引的二级索引又叫辅助索引、也叫普通索引、也叫非主键索引。普通索引的叶子节点存的是主键,所以还要去主键索引中进行一次“回表”,才能拿到真正的数据,所以二级索引实际上也可以认为是非聚集索引的一种表现形式

非聚集索引:叶子结点不存数据,而存行数据的地址

推荐使用整型作主键,整型占用的空间比字符串小,从而整型作为索引的索引文件占用空间更小、整型更适合进行比较大小

推荐使用自增主键,自增的主键能依次的把每个索引块填满,再去填下一个索引块,减少快分裂和块合并

提高链表查询效率的方法,空间换时间

Hash索引理想情况下,只需要1次磁盘IO就能查到数据,所以等值查询会比B+树快,但是不支持范围查询

联合索引

索引最左前缀原则,就是因为联合索引就是按照三个字段的顺序排好序的

覆盖索引

type为index:index代表全索引扫描,也就是扫描全索引不需要回表就能拿到结果,一般是扫描某个二级索引,这种扫描不会从索引树根节点开始快速查找,而是直接 对二级索引的叶子节点遍历和扫描,速度还是比较慢的,这种查询一般为使用覆盖索引,二级索引一般比较小,所以这 种通常比ALL快一些(但是index效率其实也是不高的,也就是对于index的情况是需要优化的)

即:如果要查找的字段组合,在主键索引里面有,在二级索引里面也能全部获取到,那么MySQL会优先走二级索引,因为二级索引占用的空间比主键索引小。比如,A表有a、b、c三个字段,a字段是主键,b字段有二级索引,那么select a,b from A;这条SQL就会优先走二级索引

ALL:即全表扫描,扫描你的聚簇索引的所有叶子节点。通常情况下这需要增加索引来进行优化了

因为主键索引占用空间比二级索引空间大,所以扫描主键索引的效率肯定就比index低一点,也就是说ALL效率比index低一点

key_len列 这一列显示了mysql在索引里使用的字节数,通过这个值可以算出具体使用了联合索引中的哪些列

Extra列 这一列展示的是额外信息。

常见的重要值如下: 1)Using index:使用覆盖索引

范围查询导致索引失效的原因

此时,范围查找,查处7条记录,需要回七次表

而全表扫描,只需要扫4页,则认为走全表扫描更快

此时,又走索引了,当mysql发现走全表扫描时,要比比走索引➕回表,要快时,就回又全表扫描

覆盖索引

就是当前你要查询的字段,正好在索引内,不需要回表 ,using index表示走了覆盖索引

【IT老齐007】为什么大厂在大表做水平分表时严禁使用自增主键

1 区间分区,会造成单机压力,尾部热点问题  2 uuid作主键会造成索引重排 3 分布式环境,用雪花算法生成id

uuid还有一个缺点,就是128,太长了

1 操作系统一页4k,innodb一页16k,innodb使用页的概念,很好的提高了磁盘读取的效率, 不然就会读一行就需要一次磁盘io,现在多行都在同一页上,只需要一次磁盘io。 操作系统弄出页的概念,也是为了提高读取磁盘的效率,也便于更好的管理磁盘

B树叶子结点只有部分数据,而b➕树,叶子结点是含有全部数据:叶子结点对应的页是数据页,叶子结点页的上面几层全是索引页,两者聚集在一起所以主键索引又叫聚集索引

从叶子结点,从左往右叫全表扫描, 从上往下检索叫走索引

主键索引的叶子结点存全部数据,普通索引的叶子结点存的是当前索引值+主键值

a字段走索引,找a大于或者小于6都能走索引,第一步会先找到a等于6,然后因为叶子结点是双向链表,所以范围查找很方便

普通索引的范围查找,有可能会导致索引失效,当数据库认为当前走全表扫描,比走普通索引+ 回表,要快时,就会走全表扫描,此时索引就失效了

提高链表查询效率的方法,空间换时间

两层的b加树比较好,3层也还行,如果4层就需要分库分表了, 三层至少可以存2000w行以上了

算法:一个int4字节,一个指针6字节,所以一页可以存16k/10b ,等于1638个对,能指向1638个页

order by 导致索引失效的原因

因为此时走索引,虽然不需要排序了,但是有多少数据就要回多少次表。而直接全表扫描,然后去内存中排序的耗时相对是很少的。所以当前这个sql走了全表扫描,而没有走索引

索引扫描原理

这里,没有where条件,但是bcd联合索引中,也存了b的值,

但是,主键索引中存了全部的数据,那么就占用了更多的页,从而走主键索引来全表扫描来获取字段b,需要扫描更多的页

但是,如果走bcd的联合索引,叶子结点只存了主键值,从而只需要扫描更少的页,就可以过去到全部行的字段b的值,所以这里系统自动选择了走bcd联合索引,而不是走主键的所在的全表扫描

order by 导致索引失效的原因

因为此时走索引,虽然不需要排序了,但是有多少数据就要回多少次表。而直接全表扫描,然后去内存中排序的耗时相对是很少的。所以当前这个sql走了全表扫描,而没有走索引

这个sql,虽然也是order by但是因为不需要回表了,所以,就还是走索引

e是字符类型, mysql再字符与数字相比时,普通字符会被先转成0,数字字符串 会被转成对应的数字,所以上面

对字段进行操作就会使索引失效

对字段进行数据类型转换,进行加减法,都会导致索引失效,但是对字段名=等号右侧的常量进行操作,不会引起索引失效

幻读强调的是集合数量的增加,不可重复读强调的是同一条记录,前后数据不一致

一个表可以有多个唯一索引,唯一索引可以有空值

大概是2000w行

读写分离优点不说了,缺点就是因为是异步复制数据的,就有可能完成数据不一致,不过这种概率是很低的,一般是可以容忍的

水平分表,有哈希分区和时间分区

带来的问题,每次查询都要带上拆分键

SQL技巧

MySQL的limit到底应该怎么优化

 

id是前端传过来的,是每次分页查询的最后一条记录

 有了覆盖索引,就不需要回表,效率也是比较好的

 

MySQL原理与学习相关推荐

  1. 对MySQL 进行深入学习是非常必要的

    MySQL 在互联网行业非常流行,腾讯,阿里等互联网巨头都在深入使用MySQL, 我在腾讯时也使用MySQL,我在微信群里经常听到大家对MySQL 的意见也很大. 在传统企业环境下使用最多的数据库产品 ...

  2. 【MySQL原理解析】01. 一条SQL查询语句是如何执行的

    这是[MySQL原理解析]的第一篇文章,MySQL我看了很多的书与教程,对其原理有一定的理解,一直想写一系列的文章来把MySQL的原理给讲清楚,一直没有时间写,今天算是个开头吧.万事开头难,咱们先破了 ...

  3. 架构师技能6:深入MySQL原理-Waiting for table metadata lock引发系统崩溃

    开篇语录:以架构师的能力标准去分析每个问题,过后由表及里分析问题的本质,复盘总结经验,并把总结内容记录下来.当你解决各种各样的问题,也就积累了丰富的解决问题的经验,解决问题的能力也将自然得到极大的提升 ...

  4. MySQL,Oracle系统学习,以及SQL语言-----数据库篇学习笔记

    Handouts MySQL和Oracle系统学习 一. 开篇立意(~~~~必看,有说明~~~~) 二. Oracle 篇 数据库存在之意义 基础概念(必须看,后面不会说明!!!) Oracle管理系 ...

  5. 深度学习Spring5底层原理(黑马学习随笔)

    学习随笔简介 跟随着黑马满老师的<黑马程序员Spring视频教程,全面深度讲解spring5底层原理>学习,视频教程地址:黑马程序员Spring视频教程,全面深度讲解spring5底层原理 ...

  6. MySQL原理--隔离级别的实现方式--MVCC

    原文网址:MySQL原理--隔离级别的实现方式--MVCC_IT利刃出鞘的博客-CSDN博客 简介 本文介绍MySQL的隔离级别的实现方式--MVCC. 这也是Java后端面试题中常见的一个问题. M ...

  7. 分布式系统服务注册与发现原理 SpringCloud 学习笔记

    分布式系统服务注册与发现原理 & SpringCloud 学习笔记 分布式系统服务注册与发现原理 引入服务注册与发现组件的原因 单体架构 应用与数据分离 集群部署 微服务架构 架构演进总结 服 ...

  8. Mysql原理与实践学习总结

    数据库(MySQL) 本文根据自己对MySQL的学习和实践以及各类文章与书籍总结而来. 囊括了MySQL数据库的基本原理和技术.本文主要是我的一个学习总结,基于之前的系列文章做了一个概括,如有错误,还 ...

  9. B站《一天学会 MySQL 数据库》学习笔记

    B站<一天学会 MySQL 数据库>学习笔记 老司机带我飞 职场十字诀:思考.计划.行动.总结.反思 ​关注他 4 人赞同了该文章 登录和退出MySQL服务器 # 登录MySQL $ my ...

最新文章

  1. 科普:String hashCode 方法为什么选择数字31作为乘子
  2. python 面向对象:类,作用域
  3. eclipse导入Java文件后出现中文乱码
  4. 51nod1258 序列求和 V4(伯努利数+多项式求逆)
  5. 反Secure Boot垄断:兼谈如何在Windows 8电脑上安装Linux
  6. java 跨域上传_java后台图片跨域上传图片 文件
  7. 傻子坐飞机问题的求解
  8. django request对象和HttpResponse对象
  9. c语言打印%-6llu,从零开始学C语言
  10. Could not find class
  11. java 视频处理_java使用ffmpeg处理视频的方法
  12. 360安全浏览器极速模式怎么设置
  13. badbody下_badboy下载_badboy测试工具2.0.5官方免费版 - 系统之家
  14. 华为云obs对象存储使用教程
  15. GD32E230_timer2解析SIF通讯协议
  16. layim之刷新群聊列表
  17. mac安装软件的一般目录
  18. 做短视频必须要知道的几个视频设置参数,爆款必备。
  19. Linux内核升级(降级)
  20. 【Python】自动化办公之Excel拆分并自动发邮件

热门文章

  1. 【PMP】核对单和核查表的区别
  2. 剑指offer面试题2:实现单例模式
  3. 假如生产环境出现CPU占用过高,如何分析思路和定位?
  4. snmp v3 参数_snmp v3的安全配置 snmp认证与加密配置(53)
  5. Android前端通过Http协议与J2EE后端数据交互。工具eclipse、MySQL、Tomcat。通过JoSn获取数据。Android端实现对MySQL增删改查功能。
  6. PostgreSQL SQL 语言:全文搜索
  7. ie浏览器通过ActiveX控件获取本机macip(附带批处理一键开启)
  8. 2020-2021中国区块链企业发展白皮书.pdf.
  9. 榆树计算机课,吉林省榆树市弓棚镇武龙中学校七年级信息技术:第九课 Excel表格计算 教案+课件 (2份打包)...
  10. 详情页用虚拟机还是云服务器,详情页用虚拟机还是云服务器