Just Do Java

Java 's Blog


  • 首页

  • 分类

  • 作者

  • 归档

  • 关于

疫情期间全家被隔离,而我辛苦一年却被无故裁员

发表于 2020-03-07 | 分类于 Kong

大家好,我是鸭血粉丝,今天不聊技术,我们聊聊裁员的事情。

img

最近阿粉的一个朋友跟阿粉抱怨,说自己被裁员了,而且去年的年终绩效考核被领导打成了最低等,没有拿到年终奖,想想自己辛苦一年最后却落得这个下场,实在是难受。为了避免泄露敏感信息,阿粉就称这个朋友为小 A 了。

听到这个消息阿粉还是很惊讶的,因为小 A 平时工作很认真负责,经常半夜还在加班,节假日就更不用说了,时常加班。为什么绩效考核会是最低等,而且还会被裁员呢?更何况还是在现在这个时期,简直是祸不单行。

阅读全文 »

HTTPDNS 协议了解吗?进来了解下

发表于 2020-03-07 | 分类于 计算机网络

说起 DNS 协议,相信大家都能说出来几句,不是很陌生。

阅读全文 »

一文带你了解分布式网关 Kong

发表于 2020-03-05 | 分类于 Kong

大家好,我是鸭血粉丝,想起来之前生产发生的事故,阿粉我的内心到现在都还很忐忑不安,今天我们来学习一个 Kong 以及跟你们聊聊做好网关限流控制的重要性。

阅读全文 »

诡异的并发之有序性

发表于 2020-03-01 | 分类于 java并发

上一节阿粉我和大家一起打到了并发中的恶霸可见性和原子性,这一节我们继续讨伐三恶之一的有序性。

阅读全文 »

诡异的并发之原子性

发表于 2020-02-28 | 分类于 java并发

上一节阿粉我和大家一起打到了并发中的恶霸可见性,这一节我们继续讨伐三恶之一的原子性。

阅读全文 »

for、foreach、Iterator 比较

发表于 2020-02-27 | 分类于 Java

本文主要介绍 for、foreach、Iterator 的主要用法和比较

for、foreach循环、iterator迭代器都是我们常用的一种遍历方式,你可以用它来遍历任何东西:包括数组、集合等

阅读全文 »

设计模式概述

发表于 2020-02-26 | 分类于 Redis

设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。

设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。

设计模式在项目开发的重要性已经不言而喻,下面就让我们一起来走进设计模式的主题中

首先先来认识一下为更好的理解设计模式打基础的 UML 建模

阅读全文 »

诡异的并发之可见性

发表于 2020-02-24 | 分类于 java并发

我们都知道,随着祖国越来越繁荣昌盛,随着科技的进步,设备的更新换代,计算机体系结构、操作系统、编译程序都在不断地改革创新,但始终有一点是不变的(我对鸭血粉丝的热爱忠贞不渝):那就是下面三者的性能耗时:CPU < 内存 < I/O

阅读全文 »

面试官问我海量数据怎么处理,我是这么回答的!

发表于 2020-02-24 | 分类于 面试

因为最近在准备面试,阿粉也准备了很多的面试题,因为之前很多的面试官都是从宏观到微观,也就是从基础的再到深入的,然后看你对这个技术的掌握程度如何,而阿粉遇到的这位面试官则是非常的有趣,问的问题也是很多不是在底层方面的,而是问的从大方面去如何把控,就比如阿粉的标题,海量数据。

阅读全文 »

Redis 小白入门以及基础搭建

发表于 2020-02-22 | 分类于 Redis

阅读全文 »

最后一波优惠来袭,即将涨价 66 元

发表于 2020-02-20 | 分类于 知识星球

大家好,我是鸭血粉丝,今天我想跟你们聊聊《Java 极客技术》知识星球的故事,因为再过几天我们就要涨价,最后几天的最低价我觉得有必要告诉你们。

还记得年前公号上发的那一篇年终总结的文章吗?2020 年已经到来,是时候总结一下过去的 2019 年了 没看过没关系,现在看也还来的及,看过的朋友我们接着往下看。

阅读全文 »

计算机基础之浮点数问题与如何精确计算小数

发表于 2020-02-20 | 分类于 java

下面这篇文章探讨的是关于浮点数与精确小数计算的理解。

阅读全文 »

不装了,我们就是那个创办260天,人数超过1700人的干货星球

发表于 2020-02-17

hello~各位读者好,我是鸭血粉丝(大家可以称呼我为「阿粉」),今天不给大家推送技术文章了,我来给大家介绍我们的星球,对就是那个创建了260天,人数已经超过了1700人的星球。

阅读全文 »

三次握手和四次挥手到底是个什么鬼东西?

发表于 2020-02-16 | 分类于 Java

之前总有是有面试官喜欢问,你知道什么是三次握手么?什么是四次挥手么?为什么握手需要三次,挥手需要四次呢?今天我们就来详细的聊一下这个。

阅读全文 »

Stack 经典面试题之判断字符串是否合法

发表于 2020-02-16 | 分类于 数据结构与算法

相信大家都知道,Stack (栈): 后进先出( Last In First Out ),也就是说后面进来的,会先出去。

阅读全文 »

程序员需要了解依赖冲突的原因以及解决办法

发表于 2020-02-16 | 分类于 Java

0x00. 前言

依赖冲突是日常开发中经常碰到的过程,如果运气好,并不会有什么问题。偏偏阿粉有点背,碰到好几次生产问题,排查一整晚,最后发现却是依赖冲突的引起的问题。

没碰到过这个问题同学可能没什么感觉,阿粉举两个最近碰到例子,让大家感受一些。

阅读全文 »

最最最实在的干货内容,整合一起发给大家

发表于 2020-02-13 | 分类于 java

hello~各位读者好,我是鸭血粉丝(大家可以称呼我为「阿粉」),在这个特殊的日子里,大家要注意安全,尽量不要出门,无聊的话,就像阿粉一样,把时间愉快的花在学习上吧。

目前JAVA极客技术已经坚持给大家推送了322篇原创内容了,每一篇都是干货满满,但是是不是对读者来说,看文章会有一点点的混乱呢,那么阿粉就来给大家整合一下关于同一个系列的文章,一起推送给大家。

阅读全文 »

阿粉带你玩转二叉查找树

发表于 2020-02-12 | 分类于 数据结构

所谓二叉查找树,就是按照二分进行查找,每次查询只需要选择其中一个子树就进行查找,从而减少查找次数,提升查询效率!

阅读全文 »

关于SQL优化,你不能只是说自己只会语句的优化了

发表于 2020-02-09 | 分类于 Java

文章有点长,请各位看官按下耐心,一定看下去,虽然数据库这块的内容很枯燥,但是一定得保证自己全部都掌握,才能拿到一个很好的Offer,不是么?

<–more–>

大部分人说的SQL优化

阿粉之前帮公司面试过一部分人,因为之前和老大一起面试,所以也看过不少人的简历,而简历上对于数据库这块内容,很多人都写的是这个样子的。

  • 熟练使用 MySQL,SQLServer,熟悉Oracle,熟悉SQL语句优化。

确实,如果你对数据库没有进行过深入的了解的时候,你也不敢往上面写,只能是去写关于SQL语句优化方面的,但是很多时候,在你写完这个SQL语句之后,你是压根不会去主动的去优化的,很多时候都是停在了,不出问题,我就不改,只要功能实现了,那么,一切万事大吉。

而本文,告诉你,不要只是会SQL语句优化。

SQL语句优化

我们在面试的时候,面试官看你写了SQL语句优化,有时候就会提问了,那你说说SQL语句优化都是在哪些方面的吧。

关于SQL语句优化,内容可就比较多了。

  • 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

  • 尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。

  • 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描。

。。。。。

类似这样的SQL语句优化还有很多很多,但是大家有没有注意到我在上面标注出来的内容,引擎? 相信大家之前肯定也都知道,但是没有做过多的研究,但是为了各位面试顺利,我们就来加紧分析这个吧。

MySQL体系

以下全文,全部按照MySQL来进行分析,分析引擎,我们先从MySQL分析吧。MySQL的体系结构图如下:

我们能从图中看出一点内容,比如说MySQL的组成部分。

  • 连接池组件

  • 管理服务和工具组件

  • SQL接口组件

  • 查询分析器组件

  • 优化器组件

  • 缓冲(Cache)组件

  • 插件式存储引擎

  • 物理文件

不得不说,这个插件式存储引擎总结的是极其精辟的呀,MySQL数据库区别于其他数据库的最重要的一个特点就是其插件式的表存储引擎。

但是我们要注意一个最重要的,那就是存储引擎是基于表的,而不是数据库。

MySQL存储引擎

存储引擎是MySQL区别于其他数据库的一个最重要特性,每个存储引擎都有他们自己的特点,不同的特点,会在不同的场景下使用,虽然我们在开发中很多时候都是使用的一种,但是能够根据具体的应用建立不同存储引擎表,这才是最牛逼的吧。

那么我们看看MySQL都支持哪些存储引擎把,手动在自己的MySQL中输入查询语句 show engines ,就会如下图所示。

大家看完是不是感觉还挺多,但是MySQL的9种存储引擎都是各自是各自的特点,然后根据需求的不同,我们在建表的时候可以选择一下,是不是发现了又一个带妹的好机会,那我们就开始分析一下吧。

1.FEDERATED存储引擎

在阿粉之前翻看书籍的时候就看到过这个,说这个引擎不是存放数据的引擎,而是一个指向远程MySQL数据库服务器的,那是什么意思呢,其实一句大白话:“我这里不存表结构文件和数据文件,我是在远程端存的”,这时候就有了个比较有意思的地方,如下图:

就像图上说的,FEDERATED存储引擎分成了2部分,一部分是本地服务,另外一部分就是远程服务,那么如果在你切换到这个引擎的时候,他在执行CRUD的时候,就会把执行操作的命令发到远程服务器,然后执行完了之后,在发回本地,然后从本地服务器中返回匹配的行即可。

在这里,阿粉不去着重的讲这个,因为重点是我们最常使用的那个,大家肯定都知道,那就是InnoDB存储引擎。

2.InnoDB存储引擎

InnoDB存储引擎这个一般也是大家在面试中经常的能和面试官侃侃而谈的一个,因为它是默认的数据库存储引擎。注意,这个默认是从MySQL的5.5.8开始的

特点比较多,下面就开始分析一下都有哪些特点吧。

  • 支持事务。默认的事务隔离级别为可重复,这个我们经常用,所以肯定也都知道。

  • 支持外键,这个外键大家肯定也都清楚,有利有弊,毕竟外键的作用在那里放着(利:增加可读性,若出现宕机,最大限度的保证数据的一致性和完整性,弊:降低了表的查询速度,如果数据了过大,那么你插入数据库数据的时长可能是不增加外键的十倍)

  • 行锁设计,这样可以支持更高的并发,这也是为什么有时候面试官说你们上ES有点大材小用,因为MySQL自己也能处理那么多。

  • 使用多版本并发控制(MVCC)来获得高并发性,并且实现了SQL标准的4种隔离级别,默认为REPEATABLE READ级别。

  • 使用一种被称为next-key locking(有人称它为间隙锁)的策略来避免幻读(phantom)现象的产生

  • 数据存储采用了聚集(clustered)的方式,每张表的存储都是按主键的顺序进行存放。

  • InnoDB的索引结构和MySQL其他的存储引擎不同,聚簇索引对主键查询性能非常高,这时候就得有个限制要求,如果表上的索引较多,主键就尽可能的小。

  • InnoDB通过一些机制和工具都支持真正的热备份,也就是在线热备份。

  • 数据存储在表空间(tablespace)中,这个表空间实际上是由InnoDB管理的一个黑盒,由一系列的文件组成。

2.1InnoDB的体系架构

我们从上面的图中就能看到,InnoDB存储引擎有许多的内存块,可以认为这些内存块其实就相当于是一个大的内存池,就是线程池是类似的那种,

既然图中我们看到了后台的线程,那么我们也要说说这个后台线程是个什么?

InnoDB存储引擎是多线程的模型,因此其后台有多个不同的后台线程,负责处理不同的任务。

而这个后台线程也是分两个部分的,一个是核心线程,一个是IO线程。

  • 核心线程Master Thread

  • IO线程 IO Thread

  • 净化线程Purge Thread

  • 清理线程Page Cleaner Thread

核心线程

核心线程的作用就是将缓冲池中的数据异步的刷新到磁盘上,来保证数据的一致性。

IO线程

IO线程则很简单,主要就是用来IO请求的回调处理。

净化线程

主要作用就是事务提交之后回收已经使用并分配的undo页

清理线程

他的作用是将之前版本中脏页的刷新操作都放入到单独的线程中来完成。

如果阿粉当时面试的时候能够把这些内容给面试官说上,相信工资肯定还能再多来点。

3.Memory 存储引擎

Memory 存储引擎实际上就是将表中的数据存放在内存中,如果数据库重启或发生崩溃,表中的数据都将消失。也就是说,如果你们的数据存储在Memory 存储引擎中,如果机房不慎掉电,那完了,之前存在里面的东西都没了,就和你用了个 rm -rf效果一样,不过一个是被动的,一个是主动的。

这种用的比较少,阿粉就不再多给大家介绍了,就说说它的特点得了,毕竟一个关机,直接就没了。

  • 不支持TEXT和BLOB类型,对于字符串类型的数据,只支持固定长度的行,VARCHAR会被自动存储为CHAR类型;

  • 速度非常快,只支持表锁,并发性能较差,并且不支持TEXT和BLOB列类型

  • 服务器一但出现宕机,所有数据全部消失

  • 存储变长字段(varchar)时是按照定常字段(char)的方式进行的,因此会浪费内存

4.MyISAM存储引擎

这个引擎特点非常明显,不支持事务,但是支持全文检索,要面向一些OLAP(联机分析处理)数据库应用.

5.BLACKHOLE存储引擎

这个引擎就像他的名字一样,肉包子打狗,有去无回,它的用途也比较简单

  • SQL 文件语法的验证

  • 用来查找与存储引擎自身不相关的性能瓶颈

6.CSV存储引擎

CSV 存储引擎实际上操作的就是一个标准的CSV 文件,而且他的特点就是不支持索引,也就说,不支持索引,那么效率必然会很低,这个相信很多人都不会选择去使用它。

针对这些引擎,阿粉就说,既然都了解了这么多的内容了,那肯定不能在继续说我们的SQL语句优化了,当你在面试的时候,就要有针对性的了。

假如说面试的时候,面试官问你:现在有一个功能,测试那边反馈过来的信息是,这个功能的响应时间超出了预期的值,你都从哪些方面入手来处理这个问题。

这个问题看似不是很难,但是可以根据这个问题延伸出很多很多的问题。

问题一:如果你说从SQL语句优化,入手,那么势必要去检查索引,而面试官下一个问题可能就是,为什么加了索引,速度就会变快。

问题二:如果你说服务器的配置,那么面试官可能心里就想,为了一个功能上的反馈,你让我去给服务器增加配置,代价太大。

如果你对索引还没有了解到很深层面的时候,这个时候你就可以把SQL语句优化,和看数据库该表的引擎是否可以进行修改,如果可以,那么你就可以开始把这些关于SQL引擎的优势往自己的方向走了。

文献参考

《高性能MySQL》 《MySQL技术内幕》;

阅读全文 »

mybatis系列之mybatis源码讲解

发表于 2020-02-07 | 分类于 Java

hello~各位读者好,我是鸭血粉丝(大家可以称呼我为「阿粉」),在这个特殊的日子里,大家要注意安全,尽量不要出门,无聊的话,就像阿粉一样,把时间愉快的花在学习上吧。

阅读全文 »
1 … 15 16 17 … 32
Java Geek Tech

Java Geek Tech

一群热爱 Java 的技术人

633 日志
116 分类
24 作者
RSS
GitHub 知乎
Links
  • 纯洁的微笑
  • 沉默王二
  • 子悠
  • 江南一点雨
  • 炸鸡可乐
  • 郑璐璐
  • 程序通事
  • 懿
© 2019 - 2022 Java Geek Tech
由 Jekyll 强力驱动
主题 - NexT.Mist