发表于: 2018-04-26 17:14:04
1 633
今日完成
深度思考:
6.自增ID有什么坏处?什么样的场景下不使用自增ID?
1、当数据库导出之后重新导入(备份再恢复),主键会重新生成,如果有其他的表以这个主键作为外键,那么会导致这个关联关系不存在。
2、数据量特别大时,会导致查询数据库操作变慢。此时需要进行数据库的水平拆分,划分到不同的数据库中,那么当添加数据时,每个表都会自增长,导致主键冲突。
与其他表格有关联的字段
7.什么是DB的索引,多大的数据量下建索引会有性能的差别,什么样的情况下该对字段建索引?
数据库建立索引常用的规则如下:
1、表的主键、外键必须有索引;
2、数据量超过300的表应该有索引;
3、经常与其他表进行连接的表,在连接字段上应该建立索引;
4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
5、索引应该建在选择性高的字段上;
6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替: A、正确选择复合索引中的主列字段,一般是选择性较好的字段; B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否 极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引; C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引; D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段; E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
8、频繁进行数据操作的表,不要建立太多的索引;
9、删除无用的索引,避免对执行计划造成负面影响;
以上是一些普遍的建立索引时的判断依据。 索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。 因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。 另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大。 总的来说,小型表肯定不建索引, 或者数据库记录在亿条数据级以上,还是建议使用非关系型数据库。 还有些特殊字段的数据库,比如BLOB,CLOB字段肯定也不适合建索引。 其实这个问题更感觉偏向于做软件项目的一种经验。
8.唯一索引和普通索引的区别是什么,什么时候需要建唯一索引。
普通索引和唯一索引都是使用btree结构,但普通索引允许被索引的数据列包含重复的值,唯一索引则必须不能重复。
唯一索引能够帮助我们判断字段是否重复,有力数据库的维护,当我们对字段有唯一性要求时,如用户名等等
9.如果对学员QQ号做了一个唯一索引,在插入数据的时候,是否需要先判断这个QQ号已经存在了?
不需要,数据库的唯一索引会帮助我们判断
10.CreateAt和UpdateAt的意义分别是创建时间和修改时间,这两个时间应该在什么情况下赋值?是否应该开放给外部调用的接口?
分别在记录创建的时候和更新的时候;
在查询的要求下可以开放端口;在更新和插入数据时不应开放,保证数据记录不被修改
11.修真类型应该是直接存储Varchar,还是应该存储int?
应建立修真类型和int的对应值,int类型在存储和查询的效率更高
12.varchar类型的长度怎么确定?有什么样的原则,和Text和LongText的区别是什么?
用尽量少的存储空间来存数一个字段的数据;
例如:能使用int就不要使用varchar、char,能用varchar(16)就不要使用varchar(256);
IP地址最好使用int类型;
固定长度的类型最好使用char,例如:邮编;
能使用tinyint就不要使用smallint,int;
最好给每个字段一个默认值,最好不能为null;
就短原则
text 字节长度65535个字节 (2^16-1)
longText 字节长度4294967295个字节(2^32-1)
13.怎么进行分页数据的查询,如何判断是否有下一页
直接用limit start, count分页语句
select * from product limit start, count
select * from product limit 10, 20
select * from product limit 100, 20
select * from product limit 1000, 20
select * from product limit 10000, 20
14.为什么不可以用Select * from table?
主要效率问题,能够确定那个字段就用那个字段,
15.什么是贫血模型,什么是充血模型?为什么我们会强制要求使用贫血模型?
贫血模型:是指领域对象里只有get和set方法,或者包含少量的CRUD方法,所有的业务逻辑都不包含在内而是放在Business Logic层。
充血模型:层次结构和上面的差不多,不过大多业务逻辑和持久化放在Domain Object里面,Business Logic(业务逻辑层)只是简单封装部分业务逻辑以及控制事务、权限等。
贫血模型在实体类中没有逻辑,更适合大型项目开发和合作开发,解耦也方便后期维护。
16.Spring中的IOC是什么意思,为什么要用IOC而不是New来创建实例?
IOC是什么?(面试题)
ioc(inverse of control )控制反转:所谓控制反转就是把对象(bean)对象和维护对象(bean)之间的关系的权利转移到Sqring容器中去了(ApplicationContext.xml)而程序本身不在维护了
DI是什么?(面试题)
di(dependency injection)依赖注入:实际上DI和IOC是同一个概念,因为在ApplicationContext.xml配置文件中bean和bean之间通过ref来维护的时候是相互依赖的,所以又叫做依赖注入。也就是控制反转。
减少依赖,方便解耦
17.为什么要使用Interface,而不是直接使用一个实体类来完成任务?Interface和Impl这种方式的好处是什么?
interfact用来描述一系列方法,implement则是这方法的具体实现。
通过iinterface可以实现对程序的封装,采用interface和impl这种方式增强了代码的可维护性
18.为什么要处理异常,Try/Catch应该在什么样的场景下使用,在真实的系统中,会出现网络中断,DB连接不上的错误吗?多久会发 生一次?
程序中的异常不予处理,则会导致线程中断,无法执行。
19.日志应该怎么打,在什么位置,需要打印出来什么样的关键参数?
成功地调试程序、监控和错误报告地关键是【日志】
System.err System.out 缺少粒度 会妨碍应用程序的性能 ,所以我们需要的是可以配置显示多或少日志信息...
【在日志记录内容】
1.当系统崩溃会阻止日志机制工作,因此JVM内建了工具,Oracle和OpenJDK 的JVM添加-XX:+HeapDumpOnOutOfMemoryError在JVM内存益处时生成堆转储。
2.用日志记录关于错误【所有信息】(类型、消息、栈跟踪以及最后一次程序在干嘛),对用户不能暴露可能危害系统的信息(文件路径、SQL查询)
3.虽然【警告】可以引起人注意,表示应用程序潜在的问题。
4.【重要】事件,帮助我们了解系统是否正常,如实体创建、组件启动、用户登录成功、任务执行成功。
5.最困难的调试场景中,需要打印出进入方法或者退出方法时间,以及每个方法的参数值和返回值。高负载应用程序中,执行循环要打印出迭代数据。
20.为什么需要单步调试?Debug的时候IDE是怎么找到源码的?
通过设置断点,参看程序运行状态,根据变量值确定错误发生位置
2、mybatis中通过trim标签,设置更新
<!--根据主键全字段更新,if字段为空,字段不更新-->
<update id="updateStudent" parameterType="com.xiuzhenyuan.task1.model.StudentDO">
UPDATE student_registrantion
<!--trim标签替代关键字set-->
<trim prefix="set" suffixOverrides=",">
<if test="name !=null and name != ''">
name=#{name},
</if>
<if test="qq !=null and qq != ''">
qq=#{qq},
</if>
<if test="type !=null and type != ''">
type=#{type},
</if>
<if test="entorTime !=null and entorTime != ''">
entor_time=#{entorTime},
</if>
<if test="graduateSchool !=null and graduateSchool != ''">
graduate_school=#{graduateSchool},
</if>
<if test="netId !=null and netId != ''">
net_id=#{netId},
</if>
<if test="dailyLink !=null and dailyLink != ''">
daily_link=#{dailyLink},
</if>
<if test="wish !=null and wish != ''">
wish=#{wish},
</if>
<if test="senior !=null and senior != ''">
senior=#{senior},
</if>
<if test="updateTime !=null and updateTime != ''">
update_time=#{updateTime},
</if>
</trim>
WHERE add_id=#{addId}
</update>
明日计划
部署数据库等客服端到服务器
困难
null
收获
mybatis的trim标签的用法
评论