做有温度的教育!
全国统一咨询热线:400-803-9399
北京
校区
新闻资讯> 求职攻略> JAVA工作1~3年面试准备:数据库

JAVA工作1~3年面试准备:数据库

时间:2018-09-19
浏览:5464
发布:甲骨文华育兴业
赞:1475

  要想进阶成Java中级开发工程师,有一些东西总是绕不过去的,Java的知识体系里,像IO/NIO/AIO,多线程,JVM,网络编程,数据库,框架等必须有一定了解才行。


数据库基本内容简单回顾(Mysql)

  三范式?

  1.列不可再分;

  2.行需要唯一区分; (一般就是说要设置主键)

  3.非主属性只依赖于主属性,而不能依赖于其它非主属性。 (就是找非主键字段只能通过主键来关联,而不是啊三啊四)


  事务?

  事务是一系列在数据库上的操作,是数据库应用中最基础的单位。

  事务有四个性质,ACID。

  原子性(Atomic) :指事务中的操作要么都发生,要么都不发生。 (如转帐扣款加款的两条语句,要么执行,要么不执行)

  一致性(Consistency):指事务使得系统从一个一致的状态转换到另一个一致状态。(此处有强一致性,弱一致性,最终一致性,其它一致性的说法)

  隔离性(Isolation):多个事务并发访问时,事务之间是隔离的,一个事务不影响其它事务的运行效果。 (此处有隔离级别的说法)

  持久性(Durability):事务完成以后,该事务所对数据库所作的更改就持久地保存在数据库中,不会被回滚。


  隔离级别?

  不考虑事务的隔离性,会发生的几种问题:脏读,不可重复读,幻读。然后数据库隔离级别有如下四种:

  读未提交(Read Uncommitted):最低的隔离级别,什么都不需要做,一个事务可以读到另一个事务未提交的结果。即可能出现脏读,不可重复读,幻读。

  读提交(Read Committed):只有在事务提交后,其更新结果才会被其他事务看见。可以解决脏读问题。

  可重复读(Repeated Read):在一个事务中,对于同一份数据的读取结果总是相同的,无论是否有其他事务对这份数据进行操作,以及这个事务是否提交。可以解决脏读、不可重复读。这是Mysql中默认的隔离级别。

  串行化(Serialization):事务串行化执行,隔离级别最高,牺牲了系统的并发性。可以解决并发事务的所有问题。

  PS:

  脏读:是指在一个事务处理过程里读取了另一个未提交的事务中的数据。

  不可重复读:是指一个事务范围内多次查询却返回了不同的数据值,是因为在查询间隔别其它事务修改并提交了。

  幻读:和不可重复读都是读取了另一条已经提交的事务,不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。

  在MySQL数据库中查看当前事务的隔离级别:

  select @@tx_isolation;set tx_isolation=’隔离级别名称;’

  在MySQL数据库中设置事务的隔离级别:

  (设置数据库的隔离级别一定要是在开启事务之前,隔离级别的设置只对当前链接有效。一个窗口,或者一个connection。而不会影响其它)


JDBC中:conn =JDBCUtils.getConnection();conn.setTransaction(Connection.TRANSACTION_SERIALIZABLE);conn.setAutoCommit(false);


  存储引擎?

  MYISAM /INNODB 区别

  MYISAM 不支持事务,不支持外键,行锁,插入数据时,锁定整个表,查表总行数时,不需要全表扫描。MyISAM的可移植性、备份及恢复较好。

  INNODB 支持事务,支持外键,行锁,查表总行数时,全表扫描。INNODB 的可移植性、备份及恢复相对较差。

  MYISAM /INNODB选择:

  MyISAM相对简单,所以在效率上要优于InnoDB。如果系统读多,写少。对原子性要求低。那么MyISAM最好的选择。

  InnoDb支持事务,如果系统写入较多或对事务一定的要求,InnoDB就是首选了。INNODB 也是默认的存储引擎。

  Mysql索引?

  索引用于快速找出在某个列中满足特定值的行。相当于是一本书的目录。

  MyISAM和InnoDB存储引擎:只支持BTREE索引。 (MEMORY/HEAP存储引擎:支持HASH和BTREE索引)

  索引我们分为四类来讲 单列索引(普通索引,唯一索引,主键索引)、组合索引 ( 遵从了最左前缀)、全文索引、空间索引、

  创建方法:

  alter table table_name add index index_name (column_list) ; alter table table_name add unique (column) ;alter table table_name add primary key (column) ;create index index_name on table_name (column);

  索引原理:

  顺序查找时间复杂度为O(n),建立索引后查找时间复杂度为O(log(n)),时间上有指数级的提高。


  数据库锁

  MySQL各存储引擎使用了三种类型(级别)的锁定机制:表级锁定,行级锁定和页级锁定。

  表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

  行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

  页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般

  MySQL数据库默认使用InnoDB存储引擎,它支持行锁,也支持表锁,默认情况下是采用行锁。

  InnoDB实现了以下两种类型的行锁。

  概念:

  共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。

  排他锁(X):允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。

  使用:

  对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁(X);

  对于普通SELECT语句,InnoDB不会加任何锁;事务可以通过以下语句显示给记录集加共享锁或排他锁。

  共享锁(S): SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE

  排他锁(X): SELECT * FROM table_name WHERE ... FOR UPDATE

  悲观锁:是一种并发控制的方法。它可以阻止一个事务以影响其他用户的方式来修改数据。如果一个事务执行的操作都某行数据应用了锁,那只有当这个事务把锁释放,其他事务才能够执行与该锁冲突的操作。悲观锁的流程:

  在对任意记录进行修改前,先尝试为该记录加上排他锁(exclusive locking)。

  如果加锁失败,说明该记录正在被修改,那么当前查询可能要等待或者抛出异常。 具体响应方式由开发者根据实际需要决定。

  如果成功加锁,那么就可以对记录做修改,事务完成后就会解锁了。

  其间如果有其他对该记录做修改或加排他锁的操作,都会等待我们解锁或直接抛出异常。

  乐观锁: 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。

  相对于悲观锁,在对数据库进行处理的时候,乐观锁并不会使用数据库提供的锁机制。一般的实现乐观锁的方式就是记录数据版本。

  数据版本,为数据增加的一个版本标识。当读取数据时,将版本标识的值一同读出,数据每更新一次,同时对版本标识进行更新。当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的版本标识进行比对,如果数据库表当前版本号与第一次取出来的版本标识值相等,则予以更新,否则认为是过期数据。

  实现数据版本有两种方式,第一种是使用版本号,第二种是使用时间戳。

注意点:

行锁必须有索引才能实现,否则会自动锁全表,那么就不是行锁了。

show create table table_name; -- 可以看到表结构与表引擎

mysql -hlocalhost -uroot -proot -- 登录

create index index_name on table_name(column); -- 创建索引

show variables like '%autocommit%'; -- 查看自动提交

set @@autocommit=0; -- 临时生效(只对当前客户端有效)

show status like ‘table%’; -- 查看表级锁的争用状态

show status like ‘innodb_row_lock%’; -- 查看行级锁的争用状态

  存储过程?

  存储过程就是编译好了的一些sql语句。 (Procedure)

  1)存储过程因为SQL语句已经预编绎过了,因此运行的速度比较快。

  2)可保证数据的安全性和完整性。通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。

  3)可以降低网络的通信量。存储过程主要是在服务器上运行,减少对客户机的压力。

  4)《阿里巴巴java编码规范》中,强制禁止使用存储过程,理由是存储过程难以调试和扩展,更没有移植性。

  mysql中确实没怎么见使用存储过程,sqlServer听说用得挺多。个人觉得不用也可以。哈哈。

  触发器?

  当满足触发器条件,则系统自动执行触发器的触发体。(Trigger)

  触发时间:有before,after.

  触发事件:有insert,update,delete三种。

  触发类型:有行触发、语句触发

  查询语句优化?

  首先,要分析这个查询语句慢的原因。是因为表数据太多,还是SQL语句写得有问题。

  可以用explain语句查看这个SQL的执行计划有没有优化空间,然后针对解决。关于explain。

  1)如果是表数据太多,就看有没有建索引,或者索引有没有用上。

  2)然后再看一下能不能减少表之间的关联

  3)然后看一下查询字段能不能简化,不用select * 而拿需要的字段,尽量返回少量数据

  4)然后就是看一下sql能不能优化,尽量让sql很快定位数据,不要让sql做全表查询,应该走索引,把数据量大的表排在前面,

  能用left join就不用子查询,能用 between 就不要用 in,也不要用 != <> like 这种使索引失效的语法。

  5)如果实在没办法的话,就看要不要分库分表。减少每张表中的数据,分而治之。

  一般来说,如果一开始数据库结构设计得好的话,每张表放三四百万数据查询起来还是挺快的。主要也是sql上的问题。

  union/union all?

  UNION在进行表链接后会筛选掉重复的记录,UNION ALL只是简单的将两个结果合并后就返回。

  从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL。


人生从业之路的第一步,从甲骨文华育兴业开始,

背后付出的辛苦与努力只有自己知道,而这也只是职业生涯的开始。

勤恳努力的人终会得到最好的回报,有些努力需要时间来回答

你吃的苦终会铺成你想要的路!

甲骨文华育兴业,为你的IT之路开启梦想之门!


【版权与免责声明】如发现内容存在版权问题,烦请提供相关信息联系我们,我们将及时沟通与处理。本站内容除非来源注明甲骨文华育兴业,否则均为网友转载,涉及言论、版权与本站无关。


相关推荐

甲骨文华育兴业

内推?来听听甲骨文华育兴业怎么说!

企业一种比较新颖的招聘方式,通过企业内部员工推荐。就是在这家公司找个靠谱的人帮你把简历直接投递给HR,只要你简历做得好一般可以直接进入面试。省略掉校招繁琐的笔试和群面等环节,越级到电面,HR面,部门主管面试等。由于企业内部员工资源有限,故内推名额还是比较稀缺的。

中日两国的程序员有什么不同

中日两国的Java程序员有什么不同

不知从什么时候起,我凡是听到中国人在日本人的面前提起 " 程序员 " 三字,从头皮到脚跟都要发麻。中国企业培训出来的程序员,和日企培训出来的 " 会写程序的人 ",从称呼、内涵到侧重点都是完全不同的。

Java常见面试题

Java常见面试题

面试过程中,技术掌握作为开启职业生涯的重中之重,以下是为正在准备面试的同学们网络整理的Java面试常见的技术性为题,包括算法、面试技巧等知识,全面提升,轻松入职!

甲骨文华育兴业

程序员面试中的5个杀手锏问题

也许你是个大数据、Java等程序员巨星,为了防止被那些烦人的猎头骚扰,不得不删除你在LinkedIn上的个人资料。又或者,也许你是一个普通、可靠的合作伙伴,一年到头也只会收到2到3次的面试邀请。不管你去面试的频率如何,下面这五个问题是每个软件工程师都应该问的——将有助于你确定自己在这家公司长期工作是否会合作愉快。

【AI大数据】2019年AI数据5大趋势 ps使用 大数据 冲刺Java架构师年薪50W

友情链接: 甲骨文华育兴业太原校区 甲骨文华育兴业北京校区 甲骨文华育兴业哈尔滨校区 甲骨文华育兴业长春校区 魔据教育

Copyright ©2016-2019. All Rights Reserved. 京ICP备17018991号-4

网站地图