秋招来袭,想学习Java进大厂的小伙伴,这7点武林秘籍一定要点开看看!(附一线互联网大厂MySQL面试高频考点)_bug_product的博客-程序员宅基地

技术标签: java  学习资料  秋招  

转眼间六月已经过了十天了。六月虽是盛夏,但秋招也不远了。提早做好准备才能在实战中游刃有余。

今天整理更新一篇Java学习分阶段路线攻略。希望能给大家一些启发,找到一条属于自己的学习线路。

本文为转载。原文链接:
https://www.nowcoder.com/discuss/663992?type=1&order=0&pos=36&page=1&channel=-1&source_id=discuss_center_1_nctrack

https://www.nowcoder.com/discuss/666255?channel=-1&source_id=discuss_terminal_discuss_sim_nctrack&ncTraceId=4814a42cfb9f473190548f2e7068c815.256.16233084385959805

一、Java学习路线图

首先,先分享一下对于不同学习方式的理解,小伙伴可以根据自己的情况选择。

  • 看视频系统学习,比如培训机构的课程、MOOC的课程等。看视频的好处就是有老师带着,易于理解和掌握,非常适合初学者。

  • 看书学习,如《Redis设计与实现》、《 Java 并发编程的艺术》,便于了解技术脉络和深入学习知识点。

  • 看博客和源码精进学习。博客的好处是有些知识点会以很通俗的方式讲解出来,我们很好理解。

二、学习路线分阶段

第一阶段:Java基础

最开始要学习的是 Java 基础,学习了这部分,就会对 Java 语言有一个初步的了解。其实大部分语言的基础知识都是大同小异,如果之前已经学习过其他语言如C、C++,那学习这部分会更快。

这部分主要学习的内容有:基本程序结构,类与对象,接口,泛型,反射,集合,异常与调试, Java 网络编程, Java I/O和多线程。

学 Java 基础,推荐大家看尚硅谷宋红康老师的 Java 教程,宋老师的课程更适合零基础学员,从 Java 语言起源开始,循序渐进,知识点剖析细致。

除此之外,还可以阅读《 Java 核心技术 卷I》,这本书偏向实用,广度和深度都恰到好处。其中,第7-9章讲述了 Java 的GUI编程, Java 的GUI开发使用并不多,这部分可以先跳过。

网上也有一些不错的文档教程网站,可以去找来辅助学习。

当学完了这部分,就可以做个图书管理系统、学生管理系统这样的小项目了。还记得库森在大二学完这部分,就跟着教程学做了个贪吃蛇游戏,还是蛮有成就感的。

当然,时间有限的小伙伴,可以不用做这块的项目,直接做 Java Web 项目就好了。

第二阶段:数据库

MySQL 和 Oracle 都是广受企业欢迎的数据库,其中 MySQL 是目前应用最广泛的开源关系数据库,对于新手或者校招的小伙伴,我们目前只学习 MySQL 就可以了。

这部分主要学习的内容有:数据库的CRUD操作、JDBC API、数据库特性和数据库连接池。

其中,数据库连接池是为了避免频繁地创建和销毁 JDBC 连接,常见连接池包括 C3P0,Druid 和 HikariCP,目前使用最广泛的是HikariCP。

书籍方面,推荐入门的小伙伴看《MySQL必知必会》,是一本小册子,这本书实践性很强,基本没有什么理论的堆砌,非常适合入门。

如果想要深入学习,可以看《高性能 MySQL》,这本书是MySQL领域的经典之作,不过就是太厚了,面试重点看索引部分就可以了。

除此之外,如果要深入学习MySQL的使用和原理,可以看极客时间的专栏《MySQL实战45讲》,阿里资深技术专家讲解的课程,有很多生产经常遇到的问题,非常有深度。

第三阶段:Java Web

学习 Java Web,我们不仅需要掌握后端 Java 技术,还需要学习些前端知识。

前端有三大基础技术 Html、CSS和 Java Script,初学的话,学习这些就可以了。如果想做出更好的交互式效果,可以再学习Vue和React等前端技术。

后端 Java 技术包括 Servlet、Filter、Listener、Session、Cookie、JSP、EL 表达式和 JSTL 等。

其中,像 JSP 这样比较老的技术,目前在各大互联网公司基本不再使用,已经被 Freemark、Thymeleaf 这样的模板引擎所替代,我们只需要了解基本使用即可。

第四阶段:主流框架

这部分我们要学习的主流框架主要有 Spring、Spring MVC 和 MyBatis,俗称 SSM 框架。

曾经的 SSH 框架,即 Struts2、Spring、Hibernate 框架,已经逐渐被 SSM 替代,现在可以不用再学 Struts2 和 Hibernate 框架了。

学习这些框架之前,我们先来学习项目管理利器Maven和Git。

4.1 Maven

Maven是一个项目管理工具,它基于项目对象模型(POM)的概念,它可以管理项目的构建、报告和文档。

Maven的本质就是一个巨大的jar包资源库,使用maven构建项目,只需在项目的pom.xml中配置相关依赖后,就可以直接从远程仓库同步到本地,再也不用满世界搜索下载jar包了,省了很多查找和下载的烦恼。

4.2 Git

Git 是一个开源的分布式版本控制系统,最大作用就是对文件进行版本管理,方便在不同版本进行切换修改,还可以很方便的协作开发。

GitHub 是基于 Git 的代码库托管站,学会了 Git ,我们就能愉快地上 Github 交友了。

喜欢文字版的小伙伴,推荐看 Git 教程,很浅显易懂

方便查阅的Git中文手册:https://git-scm.com/book/zh/v2

4.3 SSM框架

Spring 是一个轻量级的 Java 开发框架,现在已经是最受欢迎的企业级 Java 应用程序开发框架,目前已经更新到 Spring5。

Spring 框架的核心特性是依赖注入(DI)与面向切面编程(AOP),Spring 框架的组成结构图如下所示:
Spring MVC 是一个基于MVC架构,用来简化web应用程序开发的框架,它是 Spring 的一部分,SpringMVC 已经成为目前最主流的 MVC 框架之一。

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。

在使用传统JDBC时,往往需要写很多JDBC代码,需要自己写SQL语句以及自己装配参数,然后自己对结果集进行封装处理。

而Mybatis则帮我们简化了以上功能,只需要一些配置文件(xml)或是注解即可完成对数据库的查询以及结果的映射封装。

学习SSM框架,推荐使用一整套课程进行学习,会有更好的连贯性,而且还会学习整合SSM框架。

整合SSM框架还是比较繁琐的,库森之前学习时就整合了一天,时间紧张的小伙伴可以不用在整合这里花费时间,因为这种整合方式目前也不在流行了,现在直接使用更强大的利器Spring Boot就可以了。

4.4 Spring Boot

Spring Boot 采用约定大约配置的方式,大量的减少了配置文件的使用,从而使开发人员不再需要定义样板化的配置。

学习 Spring Boot,推荐雷丰阳老师的 Spring Boot 课程,课程基于 SpringBoot2.3与2.4 版本,包含核心基础、Web原理、单元测试、数据访问、指标监控等章节。

那要不要跳过了 SSM 直接去学习 Spring Boot呢?

如果只是为了使用 Spring Boot,当然可以跳过,毕竟 SSM 配置太繁琐了。

如果想深入学习,尤其是找 Java 开发的工作,面试中会出现很多 Spring 的底层问题,因此还是要学习 SSM 的,如果跳过了不利于学习原理。

第五阶段:服务器中间件

学完上面的内容,我们已经具备实际项目的开发能力了,但是要解决些复杂的业务场景,我们还要学习Redis、MQ、Elasticsearch这些中间件。

5.1 Redis

Redis 是一个 key-value 存储系统,是跨平台的非关系型数据库,可用作数据库,高速缓存和消息队列代理。

Redis作为当下主流的缓存技术,已经成为互联网企业的不二首选。

5.2 MQ

MQ(Message Queue)是一种跨进程的通信机制,用于传递消息。通俗点说,就是一个先进先出的数据结构。MQ有三大主要作用分别为解耦、异步、削峰/限流。

目前业界有很多MQ产品,比较出名的有以下四种:


小伙伴可以根据喜好或者项目需要,选择一款MQ学习。

此外,如果要深入学习,可以阅读《Kafka权威指南》,这本书由Kafka作者执笔,覆盖比较全面。

5.3 ElasticSearch

全文搜索属于最常见的需求,开源的 Elasticsearch是目前全文搜索引擎的首选。

它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github 都采用它。

Elasticsearch的底层是开源库 Lucene。但是,必须自己写代码去调用Lucene的接口。Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。

5.4 项目实战

学完了这些,就可以把这些技术整合起来做个项目,这里推荐一个社区论坛项目。

这个论坛项目不仅实现了基本的注册,登录,发帖,评论,点赞,回复功能,同时使用前缀树实现敏感词过滤,使用wkhtmltopdf生成长图和pdf,实现网站UV和DAU统计,并将用户头像等信息存于七牛云服务器。

这是项目使用到的相关技术:


这个项目作为Spring Boot实战练手很不错,老师讲解的很清晰,课程的深度和广度都有,而且课程最后还会手把手教大家将项目部署在云服务器。

课程中也会简要讲解Redis、Kafka和Elasticsearch,即使没有学过这些技术,仍然可以学习这个项目。

社区论坛项目,在GitHub上有源码
https://github.com/cosen1024/community

补充一点,现在的服务器基本都是Linux系统,将项目部署在服务器,学习些基本的Linux命令是必不可少的。

第六阶段:微服务和分布式

对于实习和校招的小伙伴来讲,学好前五阶段的技术知识,再深入学习个技术点就可以了,如果还有时间和精力的小伙伴,可以学习微服务和分布式的内容。

6.1 Spring Cloud

Spring Cloud 是一套完整的微服务解决方案,基于 Spring Boot框架。

准确的说,Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的开发便利性简化了分布式系统的开发,比如服务发现、服务网关、服务路由、链路追踪等。

6.2 Dubbo

值得一提的是,还有阿里开源Dubbo,Dubbo一个高性能优秀的服务框架。简单地说,Dubbo是一个基于Spring的RPC(远程过程调用)框架,能够实现服务的远程调用、服务的治理。

至于Spring Cloud 和Dubbo 有什么区别,大家可以搜索下。这里用网络上一个台式电脑的比喻来说就是:Dubbo 是品牌机,Spring Cloud 是组装机。

6.3 zookeeper

ZooKeeper是一个高可用的分布式管理与协调框架,基于ZAB算法(原子消息广播协议)的实现。该框架能够保证分布式环境中数据的一致性,使得ZooKeeper成为了解决分布式一致性问题的利器。

第七阶段:进阶优化

学会前面这些,我们就可以独立完成一个小项目,独立完成项目组分配给你的开发任务。

但是这还不足以写出好的代码,我们要想写出好的代码,还需要学习设计模式,学习多线程,以及JVM的内部原理等。同样,这些也是面试的必考点。

设计模式的书籍推荐《HeadFirst设计模式》,这是一本图文并茂的书籍,适合入门。

JVM 的书籍推荐《深入理解 Java 虚拟机》,这本书是 Java 开发者必看的书,很多 JVM 的文章都是来自这本书。

Java 并发方面,可以看《 Java 并发编程的艺术》,这本书深入到JVM、CPU层面讲解了 Java 并发框架、线程池的原理等,面对面试足够了;还有《并发编程实战》,这是一本不错的 Java 并发参考手册。

三、腾讯阿里MySQL总结春招面试高频考点

1、数据库三范式是什么?

(1)第一范式(1NF):字段具有原子性,不可再分。(所有关系型数据库系统都满足第一范式数据库表中的字段都是单一属性的,不可再分)

(2)第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。要求数据库表中的每个实例或行必须可以被惟一地区分。通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主关键字或主键。

(3)满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。

所以第三范式具有如下特征:

  1. 每一列只有一个值
  2. 每一行都能区分。
  3. 每一个表都不包含其他表已经包含的非主关键字信息。

2、有哪些数据库优化方面的经验

(1)用 PreparedStatement, 一般来说比 Statement 性能高:一个 sql发给服务器去执行,涉及步骤:语法检查、语义分析, 编译,缓存。

(2)有外键约束会影响插入和删除性能,如果程序能够保证数据的完整性,那在设计数据库时就去掉外键。

(3)表中允许适当冗余,譬如,主题帖的回复数量和最后回复时间等

(4)UNION ALL 要比 UNION 快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用 UNIONALL。 >>UNION 和 UNION ALL 关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。 >1. 对重复结果的处理:UNION 在进行表链接后会筛选掉重复的记录,Union All 不会去除重复记录。 >2. 对排序的处理:Union 将会按照字段的顺序进行排序;UNION ALL 只是简单的将两个结果合并后就返回。

3、请简述常用的索引有哪些种类?

(1)普通索引: 即针对数据库表创建索引

(2)唯一索引: 与普通索引类似,不同的就是:MySQL 数据库索引列的值必须唯一,但允许有空值

(3)主键索引: 它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引

(4)组合索引: 为了进一步榨取 MySQL 的效率,就要考虑建立组合索引。即将数据库表中的多个字段联合起来作为一个组合索引。

4、以及在mysql数据库中索引的工作机制是什么?

数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用 B 树及其变种 B+树

5、MySQL的基础操作命令?

(1)MySQL 是否处于运行状态:Debian 上运行命令 service mysqlstatus,在 RedHat 上运行命令 service mysqld status

(2)开启或停止 MySQL 服务 :运行命令 service mysqld start 开启服务;运行命令 service mysqld stop 停止服务

(3)Shell 登入 MySQL: 运行命令 mysql -u root -p

(4)列出所有数据库:运行命令 show databases;

(5)切换到某个数据库并在上面工作:运行命令 use databasename; 进入名为 databasename 的数据库

(6)列出某个数据库内所有表: show tables;

(7)获取表内所有 Field 对象的名称和类型 :describe table_name;

6、mysql的复制原理以及流程

Mysql 内建的复制功能是构建大型,高性能应用程序的基础。将 Mysql 的数据分布到多个系统上去,这种分布的机制,是通过将 Mysql 的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的。 * 复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。 当一个从服务器连接主服务器时,它通知主服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。
过程如下 :

①主服务器把更新记录到二进制日志文件中。

② 从服务器把主服务器的二进制日志拷贝到自己的中继日志(replay log)中。

③从服务器重做中继日志中的时间,把更新应用到自己的数据库上。

7、mysql支持的复制类型

(1)基于语句的复制: 在主服务器上执行的 SQL 语句,在从服务器上执行同样的语句。MySQL 默认采用基于语句的复制,效率比较高。 一旦发现没法精确复制时,会自动选着基于行的复制。

(2)基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执行一遍. 从 mysql5.0 开始支持

(3)混合类型的复制: 默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。

8、mysql 中 myisam 与 innodb 的区别?

(1)事务支持 > MyISAM:强调的是性能,每次查询具有原子性,其执行数度比 InnoDB 类型更快,但是不提供事务支持。 > InnoDB:提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。

(2)InnoDB 支持行级锁,而 MyISAM 支持表级锁. >> 用户在操作myisam 表时,select,update,delete,insert 语句都会给表自动加锁,如果加锁以后的表满足 insert 并发的情况下,可以在表的尾部***r>入新的数据。

(3)InnoDB 支持 MVCC, 而 MyISAM 不支持

(4)InnoDB 支持外键,而 MyISAM 不支持

(5)表主键 > MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址。 > InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个 6 字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。

(6)InnoDB 不支持全文索引,而 MyISAM 支持。

(7)可移植性、备份及恢复 > MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。 > InnoDB:免费的方案可以是拷贝数据文件、备份binlog,或者用 mysqldump,在数据量达到几十 G 的时候就相对痛苦了

(8)存储结构 > MyISAM:每个 MyISAM 在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm 文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。 > InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB。

9、mysql 中 varchar 与 char 的区别以及 varchar(50)中的 50 代表的涵义?

(1)varchar 与 char 的区别: char 是一种固定长度的类型,varchar 则是一种可变长度的类型.

(2)varchar(50)中 50 的涵义 : 最多存放 50 个字节

(3)int(20)中 20 的涵义: int(M)中的 M indicates the maximumdisplay width (最大显示宽度)for integer types. The maximumlegal display width is 255.

10、MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?

(1)Read Uncommitted(读取未提交内容) >> 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。

(2)Read Committed(读取提交内容) >> 这是大多数数据库系统的默认隔离级别(但不是 MySQL 默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的 commit,所以同一 select 可能返回不同结果。

(3)Repeatable Read(可重读) >> 这是 MySQL 的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读(PhantomRead)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB 和 Falcon 存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control 间隙锁)机制解决了该问题。注:其实多版本只是解决不可重复读问题,而加上间隙锁(也就是它这里所谓的并发控制)才解决了幻读问题。

(4)Serializable(可串行化) >> 这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

11、表中有大字段 X(例如:text 类型),且字段 X 不会经常更新,以读为为主,将该字段拆成子表好处是什么?

如果字段里面有大字段(text,blob)类型的,而且这些字段的访问并不多,这时候放在一起就变成缺点了。 MYSQL 数据库的记录存储是按行存储的,数据块大小又是固定的(16K),每条记录越小,相同的块存储的记录就越多。此时应该把大字段拆走,这样应付大部分小字段的查询时,就能提高效率。当需要查询大字段时,此时的关联查询是不可避免的,但也是值得的。拆分开后,对字段的 UPDAE 就要 UPDATE 多个表了

12、MySQL 中 InnoDB 引擎的行锁是通过加在什么上完成(或称实现)的?

InnoDB 行锁是通过给索引上的索引项加锁来实现的,这一点 MySQL 与Oracle 不同,后者是通过在数据块中对相应数据行加锁来实现的。InnoDB 这种行锁实现特点意味着:只有通过索引条件检索数据InnoDB 才使用行级锁,否则,InnoDB 将使用表锁!

13、MySQL 中控制内存分配的全局参数,有哪些?

(1)Keybuffersize

keybuffersize 指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。通过检查状态值Keyreadrequests 和 Keyreads,可以知道 keybuffersize 设置是否合理。比例 keyreads /keyreadrequests 应该尽可能的低,至少是1:100,1:1000 更好(上述状态值可以使用 SHOW STATUSLIKE‘keyread%'获得)。 > * keybuffersize 只对 MyISAM 表起作用。即使你不使用 MyISAM 表,但是内部的临时磁盘表是 MyISAM 表,也要使用该值。可以使用检查状态值 createdtmpdisktables得知详情。对于 1G 内存的机器,如果不使用 MyISAM 表,推荐值是 16M(8-64M)。

keybuffersize 设置注意事项
①单个 keybuffer 的大小不能超过 4G,如果设置超过 4G,就有可能遇到下面 3 个bug:

②建议 keybuffer 设置为物理内存的 1/4(针对 MyISAM 引擎),甚至是物理内存的 30%~40%,如果 keybuffersize 设置太大,系统就会频繁的换页,降低系统性能。因为 MySQL 使用操作系统的缓存来缓存数据,所以我们得为系统留够足够的内存;在很多情况下数据要比索引大得多。

③ 如果机器性能优越,可以设置多个keybuffer,分别让不同的 keybuffer 来缓存专门的索引

(2)innodbbufferpool_size

表示缓冲池字节大小,InnoDB 缓存表和索引数据的内存区域。mysql 默认的值是 128M。最大值与你的CPU 体系结构有关,在 32 位操作系统,最大值是 4294967295(2^32-1) ,在 64 位操作系统,最大值为18446744073709551615 (2^64-1)。

在 32 位操作系统中,CPU 和操作系统实用的最大大小低于设置的最大值。如果设定的缓冲池的大小大于 1G,设置 innodbbufferpoolinstances 的值大于 1.

数据读写在内存中非常快, innodbbufferpoolsize 减少了对磁盘的读写。 当数据提交或满足检查点条件后才一次性将内存数据刷新到磁盘中。然而内存还有操作系统或数据库其他进程使用, 一般设置 bufferpool 大小为总内存的 3/4 至 4/5。 若设置不当, 内存使用可能浪费或者使用过多。 对于繁忙的服务器, buffer pool 将划分为多个实例以提高系统并发性, 减少线程间读写缓存的争用。buffer pool 的大小首先受 innodbbufferpool_instances 影响, 当然影响较小。

(3)querycachesize

当 mysql 接收到一条 select 类型的 query时,mysql 会对这条 query 进行 hash 计算而得到一个 hash 值,然后通过该 hash 值到 query cache 中去匹配,如果没有匹配中,则将这个hash 值存放在一个 hash 链表中,同时将 query 的结果集存放进cache 中,存放 hash 值的链表的每一个 hash 节点存放了相应 query结果集在 cache 中的地址,以及该 query 所涉及到的一些 table 的相关信息;如果通过 hash 值匹配到了一样的 query,则直接将 cache 中相应的 query 结果集返回给客户端。如果 mysql 任何一个表中的任何一条数据发生了变化,便会通知 query cache 需要与该 table 相关的query 的 cache 全部失效,并释放占用的内存地址。

query cache优缺点

  1. query 语句的 hash 计算和 hash 查找带来的资源消耗。mysql 会对每条接收到的 select 类型的 query 进行 hash 计算然后查找该 query 的 cache 是否存在,虽然 hash 计算和查找的效率已经足够高了,一条 query 所带来的消耗可以忽略,但一旦涉及到高并发,有成千上万条 query 时,hash 计算和查找所带来的开销就的重视了;
  2. query cache 的失效问题。如果表变更比较频繁,则会造成 query cache 的失效率非常高。表变更不仅仅指表中的数据发生变化,还包括结构或者索引的任何变化;
  3. 对于不同 sql 但同一结果集的 query 都会被缓存,这样便会造成内存资源的过渡消耗。sql 的字符大小写、空格或者注释的不同,缓存都是认为是不同的 sql(因为他们的 hash 值会不同);
  4. 相关参数设置不合理会造成大量内存碎片,相关的参数设置会稍后介绍。

(4)readbuffersize

是 MySQL 读入缓冲区大小。对表进行顺序扫描的请求将分配一个读入缓冲区,MySQL 会为它分配一段内存缓冲区。readbuffersize 变量控制这一缓冲区的大小。如果对表的顺序扫描请求非常频繁,并且你认为频繁扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能。

14、若一张表中只有一个字段 VARCHAR(N)类型,utf8 编码,则 N 最大值为多少(精确到数量级即可)?

由于 utf8 的每个字符最多占用 3 个字节。而 MySQL 定义行的长度不能超过65535,因此 N 的最大值计算方法为:(65535-1-2)/3。减去 1 的原因是实际存储从第二个字节开始,减去 2 的原因是因为要在列表长度存储实际的字符长度,除以 3 是因为 utf8 限制:每个字符最多占用 3 个字节。

15、[SELECT *] 和[SELECT 全部字段]的 2 种写法有何优缺点?

(1)前者要解析数据字典,后者不需要

(2)结果输出顺序,前者与建表列顺序相同,后者按指定字段顺序。

(3)表字段改名,前者不需要修改,后者需要改

(4)后者可以建立索引进行优化,前者无法优化

(5)后者的可读性比前者要高

16、HAVNG 子句 和 WHERE 的异同点?

(1)语法上:where 用表中列名,having 用 select 结果别名

(2)影响结果范围:where 从表读出数据的行数,having 返回客户端的行数

(3)索引:where 可以使用索引,having 不能使用索引,只能在临时结果集操作

(4)where 后面不能使用聚集函数,having 是专门使用聚集函数的。

17、MySQL 当记录不存在时 insert,当记录存在时 update,语句怎么写?

INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY
UPDATE c=c+1;

18、MySQL 的 insert 和 update 的 select 语句语法

SQL insert into student (stuid,stuname,deptid) select 10,‘xzm’,3 from student where stuid > 8;

update student a inner join student b on b.stuID=10 set a.stuname=concat(b.stuname, b.stuID) where a.stuID=10 ;

四、小结

秋招即将来袭,好工作琳琅满目,实力是最坚实的敲门砖。

除了这篇文章整理的学习资料,我还整理了更多更详细的Java学习资料,多家互联网大厂和多位大佬的面经资料,还有更多的面试技巧。有需要的朋友可以点击进入获取。暗号:CSDN。一起好好学习,天天向上!


这篇文章所例举的只能起到一个引路的作用。希望小伙伴们都能不断学习,不断充盈自己的技能库。有一句话我一直很喜欢:“机会来了!你的枪里有子弹吗?”当机会来临,只有做好准备的人才能抓住。希望大家都能成为那个人。

如果这篇文章对你有帮助,别忘了一键三连(点赞,收藏,分享)。这对我真的很重要。谢谢大家啦!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/bug_product/article/details/117780800

智能推荐

随便推点