(JAVA初级开发)冷门,偏门⾯试题⼩结
常⽤的关系型数据库有哪些?
当前主流的关系型数据库有Oracle、DB2(对⼤型分布式应⽤系统尤为适⽤)、Microsoft SQL Server、Microsoft Access、MySQL等drop,truncate和delete
delete ⽀持事务,逐⾏删除
truncate 不⽀持事务,是⼀次性删除数据,执⾏速度快
drop drop语句将表所占⽤的空间全释放掉,速度最快
mysql面试题sql优化union,union all,except
查询表与表的交集⽤ union
查询表与表的并集⽤ union all
查询表与表的差集⽤ except
数据库中select执⾏顺序
from>on>join>where>group by>having>select>distinct>union>order by>limit
什么是视图?有什么⽤?
视图是⼀个虚拟的表,其内容由查询定义.
作⽤:
1.简化⽤户操作(简单性)
可以为常⽤的sql创建⼀个视图,这样我们原先需要连多个表,现在只需要操作⼀个表即可!
2.增加安全性
可以给不同的⽤户定义不同的视图,这样做屏蔽了底层的表结构,从⽽更好的保护了数据库安全性!
3.逻辑数据独⽴性
视图可帮助⽤户屏蔽真实表结构变化带来的影响,对重构的数据库提供了⼀定程度的逻辑独⽴性!
数据库三⼤范式和五⼤约束
第⼀范式(1NF):数据表中的每⼀列(字段),必须是不可拆分的最⼩单元,也就是确保每⼀列的原⼦性。(e.g:家庭住址(省,市,区))
第⼆范式(2NF):满⾜1NF后要求表中的所有列,每⼀⾏的数据只能与其中⼀列相关,即⼀⾏数据只做⼀件事。
只要数据列中出现数据重复, 就要把表拆分开来。
第三范式(3NF):满⾜2NF后,要求:表中的每⼀列都要与主键直接相关,⽽不是间接相关(表中的每⼀列只能依赖于主键)。反三角函数定义
force of nature要求:能举出具体的例⼦来表明你真的理解三⼤范式的规则
五⼤约束:
1.主键约束(Primay Key Coustraint) 唯⼀性,⾮空性;
2.唯⼀约束 (Unique Counstraint)唯⼀性,可以空,但只能有⼀个;
3.默认约束 (Default Counstraint) 该数据的默认值;
4.外键约束 (Foreign Key Counstraint) 需要建⽴两表间的关系;
5.⾮空约束(Not Null Counstraint):设置⾮空约束,该字段不能为空。
synchronized 与 lock 的区别
jquery库的作用获取Lock对象的⽅法:Lock lock = new ReentrantLock();
⾸先synchronized是java内置关键字,在jvm层⾯,Lock是个java类;
1.synchronized⽆法判断是否获取锁的状态,Lock可以判断是否获取到锁;
2.synchronized会⾃动释放锁,Lock需在finally中⼿⼯释放锁(lock.unlock()⽅法释放锁),否则容易造成线程死锁;
3.⽤synchronized关键字的两个线程1和线程2,如果当前线程1获得锁,线程2线程等待。如果线程1阻塞,线程2则会⼀直等待下去,⽽
4.Lock锁就不⼀定会等待下去,如果尝试获取不到锁,线程可以不⽤⼀直等待就结束了;
5.synchronized的锁可重⼊、不可中断、⾮公平,⽽Lock锁可重⼊、可判断、可公平(两者皆可)
6.Lock锁适合⼤量同步的代码的同步问题,synchronized锁适合代码少量的同步问题。
7.Lock锁可以设置等待时间,到了时间⾃动放弃获取锁
JAVA锁机制(了解即可!)
1、公平锁/⾮公平锁:
公平锁是指多个线程按照申请锁的顺序来获取锁。
⾮公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程⽐先申请的线程优先获取锁。有可能,
会造成优先级反转或者饥饿现象。
2、可重⼊锁:
可重⼊锁⼜名递归锁,是指在同⼀个线程在外层⽅法获取锁的时候,在进⼊内层⽅法会⾃动获取锁。(防⽌死锁)
3、独享锁/共享锁:
独享锁是指该锁⼀次只能被⼀个线程所持有。
共享锁是指该锁可被多个线程所持有。
4、互斥锁/读写锁:
上⾯讲的独享锁/共享锁就是⼀种⼴义的说法,互斥锁/读写锁就是具体的实现。
5、乐观锁/悲观锁:
乐观锁与悲观锁不是指具体的什么类型的锁,⽽是指看待并发同步的⾓度。
悲观锁认为对于同⼀个数据的并发操作,⼀定是会发⽣修改的,哪怕没有修改,也会认为修改。因此对于同⼀个数据的并发操作,
悲观锁采取加锁的形式。悲观的认为,不加锁的并发操作⼀定会出问题。
乐观锁则认为对于同⼀个数据的并发操作,是不会发⽣修改的。在更新数据的时候,会采⽤尝试更新,不断重新的⽅式更新数据。
乐观的认为,不加锁的并发操作是没有事情的。
从上⾯的描述我们可以看出,悲观锁适合写操作⾮常多的场景,乐观锁适合读操作⾮常多的场景,不加锁会带来⼤量的性能提升。
悲观锁在Java中的使⽤,就是利⽤各种锁。
乐观锁在Java中的使⽤,是⽆锁编程,常常采⽤的是CAS算法,典型的例⼦就是原⼦类,通过CAS⾃旋实现原⼦操作的更新。
重量级锁是悲观锁的⼀种,⾃旋锁、轻量级锁与偏向锁属于乐观锁.
6、分段锁:
7、偏向锁/轻量级锁/重量级锁
8、⾃旋锁(urrent包下的⼏乎都是利⽤锁):
⾃旋锁原理⾮常简单,如果持有锁的线程能在很短时间内释放锁资源,那么那些等待竞争锁的线程就不需要做内核态和⽤户态之间的
切换阻塞挂起状态,它们只需要等⼀等(⾃旋),等持有锁的线程释放锁后即可⽴即获取锁,这样就避免⽤户线程和内核的切换的消耗。索引的类型及优缺点
1.普通索引:仅加速查询
2.唯⼀索引:加速查询 + 列值唯⼀(可以有null)
3.主键索引:加速查询 + 列值唯⼀(不可以有null)+ 表中只有⼀个
4.组合索引:多列值组成⼀个索引,专门⽤于组合索引,其效率⼤于索引合并
5.全⽂索引:对⽂本的内容进⾏分词,进⾏搜索
优点:
1.通过创建唯⼀性索引,可以保证数据库表中每⼀⾏数据的唯⼀性。
2.可以⼤⼤加快数据的检索速度,这也是创建索引的最主要的原因。
3.可以加速表和表之间的连接,特别是在实现数据的参考完整性⽅⾯特别有意义。
4.在使⽤分组和排序⼦句进⾏数据检索时,同样可以显著减少查询中分组和排序的时间。
5.通过使⽤索引,可以在查询的过程中,使⽤优化隐藏器,提⾼系统的性能。
缺点:
1.创建索引和维护索引要耗费时间,这种时间随着数据量的增加⽽增加。
2.索引需要占物理空间,除了数据表占数据空间之外,每⼀个索引还要占⼀定的物理空间,
如果要建⽴聚簇索引, 那么需要的空间就会更⼤。
3.当对表中的数据进⾏增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
数据库索引
数据库索引是数据库管理系统中的⼀个排序的数据结构,以协助快速查询,更新数据库表中数据,索引的实现通常使⽤B树(B-tree)以及其变种B+tree(⼀些⾼效率的算法)
–使⽤索引时有些不⽣效的情况
1、使⽤like关键字模糊查询时,% 放在前⾯索引不起作⽤,只有“%”不在第⼀个位置,索引才会⽣效(like ‘%⽂’–索引不起作⽤)
2、使⽤联合索引时,只有查询条件中使⽤了这些字段中的第⼀个字段,索引才会⽣效
3、使⽤OR关键字的查询,查询语句的查询条件中只有OR关键字,且OR前后的两个条件中的列都是索引时,索引才会⽣效,否则索引不⽣效。html制作手机网页
4、尽量避免在where⼦句中使⽤!=或<>操作符,否则全表扫描。
5、对查询进⾏优化,应尽量避免全表扫描,⾸先应考虑在where以及order by涉及的列上建⽴索引。
6、应尽量避免在 where ⼦句中对字段进⾏表达式操作,否则全表扫描。
7、尽量避免在where⼦句中对字段进⾏函数操作,否则全表扫描。
8、不要在 where ⼦句中的“=”左边进⾏函数、算术运算或其他表达式运算,否则系统将可能⽆法正确使⽤索引。
9、并不是所有的索引对查询都有效,sql是根据表中的数据来进⾏查询优化的,当索引列有⼤量数据重复时,sql查询不会去利⽤索引
10、索引并不是越多越好,索引固然可以提⾼相应的 select 的效率,但同时也降低了 insert 及 update 的效率,
因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况⽽定。⼀个表的索引数最好不要超过6个,11、尽量使⽤数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。
这是因为引擎在处理查询和连接时会 逐个⽐较字符串中每⼀个字符,⽽对于数字型⽽⾔只需要⽐较⼀次就够了。
12、mysql查询只使⽤⼀个索引,因此如果where⼦句中已经使⽤了索引的话,那么order by中的列是不会使⽤索引的。
因此数据库默认排序可以符合要求的情况下不要使⽤排序操作,尽量不要包含多个列的排序,如果需要最好给这些列建复合索引。13、order by 索引 ,不起作⽤的问题(除了主键索引之外):
1、 如果select 只查询索引字段,order by 索引字段会⽤到索引,要不然就是全表排列;
2、如果有where 条件,⽐如where vtype=1 order by vtype asc . 这样order by 也会⽤到索引!
常见编码集
ISO-8859-1 西欧字符
GBK 国标编码
UNICODE 万国码 统⼀码
UTF-8
软件设计的开闭原则OCP
开放功能扩展,关闭源码修改。
开闭原则的英⽂全称是Open Close Principle,缩写是OCP,它是Java世界⾥最基础的设计原则,
它指导我们如何建⽴⼀个稳定的、灵活的系统。
开闭原则的定义是:软件中的对象(类、模块、函数等)应该对于扩展是开放的,但是对于修改是封闭的。
开闭原则,是⼀种设计模式,随着⾯向对象程序设计的思想,应运⽽⽣。
开:指的是可以在源代码的基础上进⾏扩展,⽐如继承,接⼝,抽象类等。在JAVA中,之所以⽤继承,是在可以直接调⽤类库的前提下,对其功能进⾏扩展。不需要应⽤者去了解封装类的内部逻辑就
可以做开发。
闭:指不允许对原有的代码进⾏修改。以免影响其他现有功能,造成功能瘫痪。
SQL优化
1、查询语句中不要使⽤ *
2、尽量减少⼦查询,使⽤关联查询(left join,right join,inner join)替代
3、减少使⽤IN或者NOT IN ,使⽤exists,not exists或者关联查询语句替代
4、or 的查询尽量⽤ union或者union all 代替
(在确认没有重复数据或者不⽤剔除重复数据时,union all会更好)
5、合理的增加冗余的字段(减少表的联接查询)
6、增加中间表进⾏优化(这个主要是在统计报表的场景,content type是什么
后台开定时任务将数据先统计好,尽量不要在查询的时候去统计)
7、建表的时候能使⽤数字类型的字段就使⽤数字类型(type,status…),数字类型的字段作为条件查询⽐字符串的快
8、那些可以过滤掉最⼤数量记录的条件必须写在WHERE⼦句的最末尾
分布式环境如何保证session⼀致性
2.使⽤spring-session框架来解决,底层采⽤重写httpclient保证数据共享
3.使⽤token令牌代替session功能,把数据存放在redis中,每次从redis中获取数据
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论