logo  

Java编程实用经验

Java编程实用经验
作者: 陈安廉

摘要:软件开发进阶系列


JAVA工程师面试题


2021-04-29 09:16:12


索引考虑的问题

外键关联必须用主键。不能用业务键,因为业务键比较大,占用更大的索引空间。如果该字段是不更新字段,可以冗余业务键方便展示,展示信息时避免需要再用主键查出业务键。

联表查询的连接条件需要用索引,最好用主键。

主键必须要尽量短;因为主键会作为引用值存储在二级索引的叶子节点中。短可以节省空间。建议用数字id,自增或者雪花id


联表查询注意

在 left join 语句中,左表过滤必须放 where 条件中,右表过滤必须放 on 条件中,这样结果才能不多不少,刚刚好。


数据更新尽量根据主键进行

避免死锁


3IN 和 EXISTS 有什么区别

SELECT * 
FROM t_emp 
WHERE dept_id IN 
    (SELECT dept_id 
    FROM t_dept);

// 这条SQL 语句相当于:
for SELECT dept_id FROM t_dept
    for SELECT * FROM t_emp WHERE t_emp.dept_id = t_dept.dept_id

这里虽然我们编写的SQL 语句是主查询员工信息,子查询部门id ,但是MySql 的执行顺序会先执行子查询,再执行主查询,然后获得我们要查询的数据。

 SELECT * 
 FROM t_emp 
 WHERE EXISTS 
     (SELECT 1 
     FROM t_dept 
     WHERE t_dept.dept_id = t_emp.dept_id);

// 这条SQL 语句相当于:     
for SELECT * FROM t_emp 
    for SELECT * FROM t_dept  WHERE t_dept.dept_id = t_emp.dept_id          

我们可以将EXISTS 语法理解为:将主查询的数据放在子查询中做条件验证,根据结果TRUE 和 FALSE 来决定主查询中的数据是否需要保留。EXISTS 子查询只返回TRUE 或 FALSE ,因此子查询中的SELECT * 可以是SELECT 1 或者其他,MySql 的官方说在实际执行时会忽略SELECT 清单,因此是没有 什么区别的。EXISTS 子查询其实在执行时,MySql 已经对它做了一些优化并不是对每条数据进行对比。












表的字段太多有什么坏处。

开启异步任务需要注意什么。1.主线程的事务还未提交,导致异步线程中的数据不一致。

线程池。

事务隔离级别、事务传播机制






Java开发工程师笔试题(20210628)-UEDITOR-20210712095449297.docx




初级:掌握编程语言语法,能实现某个具体功能的方法;

中级:能实现一个单体项目的功能的完整流程,包括交互方案、数据库设计。

高级:能独立搭建一个单体项目,进行功能模块划分,独立负责单个系统。

架构师:能进行集群、分布式架构,解决高并发、海量数据问题。负责复杂系统。


理论深度

经验


经典解决方案、直觉






数据库调优:使用索引,使用子表存储大字段;减少连表;分表;

数据库配置优化:开启慢查询,开启binlog,

innodb_buffer_pool_size

innodb_log_file_size






语言基础

反射

注解

threadlocal

枚举

泛型

匿名内部类

lamda

原子类

同步控制

jvm




数据库基础

索引

联表查询

联表更新

分组查询

列合并查询

行合并查询

表设计:扩展表、树形关系(1对多)、网络关系(多对多)

锁表

在线ddl



其他

字节序

TCP

http

防火墙

磁盘挂载

linux查看文件

图灵机

加法器




架构设计

长连接(websocket、socket)集群的集群架构方案

分布式事务解决方案

分库分表解决方案

幂等接口

MQ

缓存

读写分离

系统拆分

NOSQL