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