面试问题1

  1. 数据库SQL语句常用优化

     1.尽量避免在列上做运算,会导致索引失效
     2.使用join时应该用小结果集驱动大结果集,同时把复杂的join查询拆分成多个query。
     3.注意like模糊查询的使用,避免使用%%,例如select * from a where name like '%de%';代替语句:select * from a where name >= 'de' and name < 'df';
     4.仅列出需要查询的字段,不要使用select * from ...,节省内存;
     5.使用批量插入语句,节省交互;
     6.limit基数比较大时,使用between ... and ...
     8.避免使用null ,这就需要在建表时,尽量设置为not null,提升查询性能
     9.不要使用count(id),而应该是count(*)
    

    {
    1、from 语句中一定不要使用子查询;

    2、使用更多的where加以限制,缩小查找范围;
    
    3、合理利用索引;
    
    4、通过explain查看sql性能;
    

    }

此处设定count(a),其中a为变量,可以为各种值,下面根据a的不同值,得出不同的count(a)的结果

    1)当a = null时,count(a)的值为0;
    
    2)当a != null 且不是表的列名的时候,count(a)为该表的行数;
    
    3)当a是表的列名时,count(a)为该表中a列的值不等于null的行的总数,它和2)中的差值就是该表中a列值为null的行数

2. log4j的日志级别
log4j规定了默认的几个级别:trace<debug<info<warn<error<fatal
trace: 是追踪,就是程序推进以下,你就可以写个trace输出
debug: 调试么
info: 输出一下你感兴趣的或者重要的信息
warn: 有些信息不是错误信息,但是也要给程序员的一些提示
error: 错误信息
fatal: 级别比较高了。重大错误,这种级别你可以直接停止程序了

3.数据库MySQL 两种数据库引擎的区别
MyISAM与InnoDB的区别
  InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能。

以下是一些细节和具体实现的差别:
1.InnoDB不支持FULLTEXT类型的索引。
2.InnoDB 中不保存表的具体行数,也就是说,执行select count() fromtable时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count()语句包含where条件时,两种表的操作是一样的。
3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除
5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。

一般来说,MyISAM适合
(1)做很多count 的计算;
(2)插入不频繁,查询非常频繁;
(3)没有事务。

InnoDB适合:
(1)可靠性要求比较高,或者要求事务;
(2)表更新和查询都相当的频繁,并且表锁定的机会比较大的情况指定数据引擎的创建
让所有的灵活性成为可能的开关是提供给ANSI SQL的MySQL扩展——TYPE参数。MySQL能够让你在表格这一层指定数据库引擎,所以它们有时候也指的是table formats。

MySQL 官方对InnoDB是这样解释的:
InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎

InnoDB*锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读,这些特色增加了多用户部署和性能。没有在InnoDB中扩大锁定的需要,因为在InnoDB中行级锁定适合非常小的空间。

**InnoDB也支持FOREIGN KEY强制。**在SQL查询中,你可以自由地将InnoDB类型的表与其它MySQL的表的类型混合起来,甚至在同一个查询中也可以混合。
InnoDB是为处理巨大数据量时的最大性能设计,它的CPU效率可能是任何其它基于磁盘的关系数据库引擎所不能匹敌的。
InnoDB存储引擎被完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB存储它的表&索引在一个表空间中,表空间可以包含数个文件(或原始磁盘分区)。这与MyISAM表不同,比如在MyISAM表中每个表被存在分离的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上。
InnoDB默认地被包含在MySQL二进制分发中。Windows Essentials installer使InnoDB成为Windows上MySQL的默认表。
InnoDB被用来在众多需要高性能的大型数据库站点上产生。
MYSQL支持三个引擎:ISAM、MYISAM和HEAP。
· MyISAM:默认的MySQL插件式存储引擎,它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。注意,通过更改STORAGE_ENGINE配置变量,能够方便地更改MySQL服务器的默认存储引擎。

· InnoDB:用于事务处理应用程序,具有众多特性,包括ACID事务支持。(提供行级锁)

· BDB:可替代InnoDB的事务引擎,支持COMMIT、ROLLBACK和其他事务特性。

· Memory:将所有数据保存在RAM中,在需要快速查找引用和其他类似数据的环境下,可提供极快的访问。

· Merge:允许MySQL DBA或开发人员将一系列等同的MyISAM表以逻辑方式组合在一起,并作为1个对象引用它们。对于诸如数据仓储等VLDB环境十分适合。

· Archive:为大量很少引用的历史、归档、或安全审计信息的存储和检索提供了完美的解决方案。

· Federated:能够将多个分离的MySQL服务器链接起来,从多个物理服务器创建一个逻辑数据库。十分适合于分布式环境或数据集市环境。

· Cluster/NDB:MySQL的簇式数据库引擎,尤其适合于具有高性能查找要求的应用程序,这类查找需求还要求具有最高的正常工作时间和可用性。

· Other:其他存储引擎包括CSV(引用由逗号隔开的用作数据库表的文件),Blackhole(用于临时禁止对数据库的应用程序输入),以及Example引擎(可为快速创建定制的插件式存储引擎提供帮助)。

一般来说不使用事务的话,请使用MyISAM引擎,使用事务的话,一般使用InnoDB

4.spring 有哪些特性?
spring容器帮我们new指定实例并且将实例注入到需要该对象的类中,依赖注入的另一种说法是“控制反转”,通俗理解是,new一个实例交给spring容器来做。
IOC 依赖注入的多种方式:
Set注入
构造器注入
静态工厂方法注入
实例工厂方法注入

5.spring中用到的九种设计模式
第一种:简单工厂

第二种:工厂方法(Factory Method)

第三种:单例模式(Singleton)

第四种:适配器(Adapter)
在Spring的Aop中,使用的Advice(通知)来增强被代理类的功能。Spring实现这一AOP功能的原理就使用代理模式(1、JDK动态代理。2、CGLib字节码生成技术代理。)

第五种:包装器(Decorator)

第六种:代理(Proxy)
为其他对象提供一种代理以控制对这个对象的访问。 从结构上来看和Decorator模式类似,但Proxy是控制,更像是一种对功能的限制,而Decorator是增加职责。
spring的Proxy模式在aop中有体现,比如JdkDynamicAopProxy和Cglib2AopProxy。

第九种:模板方法(Template Method)
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

6.分布式系统的优缺点?
1.增大系统容量。
我们的业务量越来越大,而要能应对越来越大的业务量,一台机器的性能已经无法满足了,我们需要多台机器才能应对大规模的应用场景。所以,我们需要垂直或是水平拆分业务系统,让其变成一个分布式的架构。
2.加强系统可用。
我们的业务越来越关键,需要提高整个系统架构的可用性,这就意味着架构中不能存在单点故障。
这样,整个系统不会因为一台机器出故障而导致整体不可用。所以,需要通过分布式架构来冗余系统以消除单点故障,从而提高系统的可用性。
3.因为模块化,所以系统模块重用度更高
4.因为软件服务模块被拆分,开发和发布速度可以并行而变得更快
5.系统扩展性更高
6.团队协作流程也会得到改善

	1.从上面的表格可以看到,分布式系统虽然有一些优势,但也存在一些问题
	
	2.架构设计变得复杂(尤其是其中的分布式事务)
	
	3.部署单个服务会比较快,但是如果一次部署需要多个服务,部署会变得复杂
	
	4.系统的吞吐量会变大,但是响应时间会变长
	
	5.运维复杂度会因为服务变多而变得很复杂
	
	6.架构复杂导致学习曲线变大
	
	7.测试和查错的复杂度增大
	
	8.技术可以很多样,这会带来维护和运维的复杂度
	
	9.管理分布式系统中的服务和调度变得困难和复杂

所以总结一下,分布式系统架构的难点在于系统设计,以及管理和运维。

传统项目存在问题:

1:模块之间耦合度太高,其中一个功能升级,其他的模块都得一起升级部署。

2:开发困难,各个团队开发最后都要整合在一起.

3:系统扩展性差

4:不能灵活进行分布式部署

解决方案:

把模块才分成独立的工程,单节点运行,如果某一个节点压力大了可以单独对这个节点进行增加配置,其他节点不受影响。缺点就是系统之间交互需要额外的工作量来进行接口的开发。把系统拆分成多个工程,需要完成系统的工程需要多个工程协作完成,这种形式就叫做分布式。

分布式:

把系统拆分成多个子系统.优点:

1:把模块拆分,使用接口通信,降低模块之间的耦合度.

2:把项目拆分成若干个子项目,不同的团队负责不同的子项目.

3:增加功能时只需要再增加一个子项目,调用其他系统的接口就可以。

4:可以灵活的进行分布式部署.

5:提高代码的复用性,比如service层,如果不采用分布式rest服务方式架构就会在手机wap商城,微信商城,pc,android,ios每个端都要写一个service层逻辑,开发量大,难以维护一起升级,这时候就可以采用分布式rest服务方式,公用一个service层。

**缺点:**系统之间的交互要使用远程通信,接口开发增大工作量,但是利大于弊,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值