发表于: 2018-04-26 17:14:04

1 633


今日完成

深度思考:

6.自增ID有什么坏处?什么样的场景下不使用自增ID?

1、当数据库导出之后重新导入(备份再恢复),主键会重新生成,如果有其他的表以这个主键作为外键,那么会导致这个关联关系不存在。 
2、数据量特别大时,会导致查询数据库操作变慢。此时需要进行数据库的水平拆分,划分到不同的数据库中,那么当添加数据时,每个表都会自增长,导致主键冲突。

与其他表格有关联的字段

7.什么是DB的索引,多大的数据量下建索引会有性能的差别,什么样的情况下该对字段建索引?

       索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。

数据库建立索引常用的规则如下:

  1. 1、表的主键、外键必须有索引;

  2.  2、数据量超过300的表应该有索引; 

  3. 3、经常与其他表进行连接的表,在连接字段上应该建立索引; 

  4. 4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;

  5.  5、索引应该建在选择性高的字段上; 

  6. 6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引; 

  7. 7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替: A、正确选择复合索引中的主列字段,一般是选择性较好的字段; B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否 极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引; C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引; D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段; E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引; 

  8. 8、频繁进行数据操作的表,不要建立太多的索引; 

  9. 9、删除无用的索引,避免对执行计划造成负面影响;

  10.         以上是一些普遍的建立索引时的判断依据。 索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。 因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。 另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大。 总的来说,小型表肯定不建索引, 或者数据库记录在亿条数据级以上,还是建议使用非关系型数据库。 还有些特殊字段的数据库,比如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标签的用法 


返回列表 返回列表
评论

    分享到