1. newsfilter,Java程序员面试中容易被问哪些问题?
不请自来
面试总结——Java高级工程师
面试前面也总结了一和二, 这第三篇可能更偏向于是内心的独白篇和面试技巧总结吧.....
一、独白
之前也面试别人,现在轮到自己找工作,怎么说呢,每个面试官的看法不一样,面试的方式就不一样,比如我面试别人我喜欢问项目中他用到了那些,然后针对用到的技术去问一些问题,或者说对于某些场景的一些技术实现方案是我特别喜欢问的,比如当你的接口服务数据被人截包了,你如何防止数据恶意提交? 相对来说,Java的底层和基础会问的少一点,当然问的少不是代表不问,而是说侧重点在于你的所做过的项目和你的设计思路如何。当然,懂基础和底层更好,这样能让你知其然,更知其所以然,写出来的代码和程序更具有健壮性和可维护性。所以说,基础还是很重要的。
现在轮到自己出去面试,怎么说呢,其实还是挺紧张的,原以为自己不会因此紧张或者焦虑,实际上,还是有的,在没找到合适的工作的时候,甚至晚上有点睡不着觉,总觉着有什么事压在心头,睡觉都不安心。既然睡不着,那还是看看资料吧,我有个习惯,睡前看点问题,第二天早上就能想到答案,睡前记点资料,第二天早上就能记得特别深刻,不说废话了,直接进入正题吧。
二、面试技巧
1、背熟你的简历
原因:面试的第一个问题,一般都是让你简单介绍下你自己,或者介绍一下你最近的项目,而一个面试者,如果连自己的简历都无法熟知,对里面提到的项目、技术都无法描述清楚的话,我想没有哪家公司会接受这样的,哪怕你是超级人才,你自我表述不行,估计也会为此头疼,所以,切记:一定要背好自己的简历,不要求你能全部记下,至少要熟记你最近所待过的两家公司,这两家公司里面你做过的项目,你负责的模块,项目里面用到的技术以及相对应的技术实现方案(这个尤为重要)。
2、深入了解并熟记部分Java基础知识
原因:大部分公司无论面试初级还是高级,无论是笔试还是面试,都会问到一系列基础题,这些基础题大概涵括jvm、字符串、集合、线程等等,如果说每一个让你死记硬背你肯定记不住,那么就是理解中记忆了,拿jvm来说 ,如果让你谈谈你对jvm的理解, 那么你首先得知道JVM有哪些结构组成,每个结构用来做什么的,然后考虑一个Java对象从创建到回收,如何途径JVM这些结构的。如果你从这些方面来综合记忆,相信事半功倍,并且你理解的更透彻。 至于如果让你谈集合,举例List集合下面ArryList、LinkedList、Vector等集合的区别,那么同样的方法,你需要理解每一个的结构组成是什么,你才能知道他有什么作用,这样你在平时的用法上会更精炼,而且在面试过程中,也不至于哑口无言。
3、保持自信心和沉重冷静的心态
原因:面试过程中,自信是少不了的,相信你可以, 面试的路上可以自己对自己说一句: I belive I can ! 反正我就是这么做的,自我的心里暗示吧,其实面对面试官的时候,你自信的状态也会让面试官觉得你是个很有底气的人,至少从感觉上会给你打个高分。另外还有就是保持沉重冷静,如果是让你提供技术方案或者说说某个技术原理,没必要一紧张一咕噜的什么都说,你可以对面试官说:我先想想,然后自己组装记忆中的知识,组装下语言,有条理的说出来,这样能更好的表现你的才能,不是吗? 面试谁都会紧张,我也会紧张,有时候明明记得的知识点忘了,没关系,大胆的说忘了,或者直接说不知道。 要记住,有部分不知道没关系,如果全都知道,那你应该是CTO级别了(开个玩笑)。
4、尽量记住面试过程中你回答不出来或者回答存在不妥的问题
原因:面试失败了没关系,毕竟每个公司的要求不一样,问的问题和你擅长的方面可能有所出入,但是请记住一点:面试过程中那些你回答不出来问题,或者你自己感觉回答不太准确的问题,自己记下来,如果不会的,你可以当场问问面试官有没有好的解答,如果面试官不愿意告诉你(一般是基础方面面试官就懒得答你),那么你就自己回家慢慢查资料,如果是某些特定的技术,也可以自己写写案例什么的,毕竟知识点就那么多,问题百变,原理不变,面试也是一个学习知识的过程,让你了解大部分公司目前需要或者要求的技术。这次不知道,下次就知道了
5、去面试之前,最好先了解你要去面试公司的情况(包括产品、项目情况)
原因:俗话说,知己知彼,百战不殆,面试就是一场战斗,你需要了解你面试公司基本情况,包括岗位要求,这样你就能大概知道你需要面试的这家公司的技术要求情况。 为何让你去了解这家公司的主营产品和项目呢,就是让你大概了解这家公司的一个技术架构的情况,包括你可能对他们的一种实现方式提出质疑和疑惑,相信面试官很愿意帮你解答这些问题的。这样你既图了表现,也学到了知识,何乐而不为。
6、合理安排你的面试时间(如果有多家公司的面试机会,尽量把你想去的公司放到最后去面试)
原因:估计很多人都不理解这个,可能大部分的人对于如何安排面试时间比较迷茫,随意安排。可是这里有个技巧,如果同时有多个面试机会,你把你最想去的公司放到最末尾去面试,这样你经历过了前面的这些公司筛选,如果成功了是个机会,如果没成功,也是为最后做铺垫。 不过这里就需要考虑两点:1、你需要记住你投简历的公司和基本情况(这说明你不是海投的) 2、如果记不住,那么可以先应答一个时间,后续了解公司信息之后,通过邮件或者其他方式与其约定,调整面试时间。而且建议安排一天的面试公司不要超过两家,最好的是上午一家,下午一家,这样你能有充足的时间调整状态。
三、面试题基础总结
1、 JVM结构原理、GC工作机制详解
答:具体参照:JVM结构、GC工作机制详解,说到GC,记住两点:1、GC是负责回收所有无任何引用对象的内存空间。 注意:垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象本身,2、GC回收机制的两种算法,a、引用计数法 b、可达性分析算法( 这里的可达性,大家可以看基础2 Java对象的什么周期),至于更详细的GC算法介绍,大家可以参考:Java GC机制算法
2、Java对象的生命周期
答:创建阶段 、 应用阶段 、不可见阶段 、不可达阶段 、收集阶段 、终结阶段、 对象空间重新分配阶段等等,具体参照:Java 对象的生命周期
3、Map或者HashMap的存储原理
答:HashMap是由数组+链表的一个结构组成,具体参照:HashMap的实现原理
4、当数据表中A、B字段做了组合索引,那么单独使用A或单独使用B会有索引效果吗?(使用like查询如何有索引效果)
答:看A、B两字段做组合索引的时候,谁在前面,谁在后面,如果A在前,那么单独使用A会有索引效果,单独使用B则没有,反之亦然。同理,使用like模糊查询时,如果只是使用前面%,那么有索引效果,如果使用双%号匹配,那么则无索引效果
5、数据库存储日期格式时,如何考虑时区转换问题?
答:使用TimeStamp , 原因参照:Java编程中遇到的时区转换问题
6、JavaObject类中有哪些方法?
答:Object有哪些方法
7、HTTP协议,GET和POST 的区别
答:浅谈HTTP中GET和POST的区别
四、线程、设计模式、缓存方面
1、SimpleDataFormat是非线程安全的,如何更好的使用而避免风险呢
答:关于SimpleDateFormat安全的时间格式化线程安全问题
2、如何看待设计模式,并简单说说你对观察者模式的理解
答:1、设计模式有神马用2、观察者模式类图及实现
3、集群环境中,session如何实现共享
答:1、Java集群之session共享2、session多服务器共享方案,还有一种方案就是使用一个固定的服务器专门保持session,其他服务器共享
4、分布式、集群环境中,缓存如何刷新,如何保持同步?
答:A、缓存如何刷新?1、定时刷新 2、主动刷新覆盖,每个缓存框架都有自带的刷新机制,或者说缓存失效机制,就拿Redis和 Ehcache举例, 他们都有自带的过期机制,另外主动刷新覆盖时,只需获取对应的key进行数据的覆盖即可
B、缓存如何保持同步? 这个redis有自带的集群同步机制,即复制功能,具体参考:基于Redis分布式缓存实现,Ehcache也有分布式缓存同步的配置,只需要配置不同服务器地址即可,参照:Ehcache分布式缓存同步
5、一条sql执行过长的时间,你如何优化,从哪些方面?
答:1、查看sql是否涉及多表的联表或者子查询,如果有,看是否能进行业务拆分,相关字段冗余或者合并成临时表(业务和算法的优化)
2、涉及链表的查询,是否能进行分表查询,单表查询之后的结果进行字段整合
3、如果以上两种都不能操作,非要链表查询,那么考虑对相对应的查询条件做索引。加快查询速度
4、针对数量大的表进行历史表分离(如交易流水表)
5、数据库主从分离,读写分离,降低读写针对同一表同时的压力,至于主从同步,MySQL有自带的binlog实现 主从同步
6、explain分析sql语句,查看执行计划,分析索引是否用上,分析扫描行数等等
7、查看mysql执行日志,看看是否有其他方面的问题
个人理解:从根本上来说,查询慢是占用mysql内存比较多,那么可以从这方面去酌手考虑
五、设计方案相关
面试还会问到一些关于设计方案相关的问题,比如
1、你的接口服务数据被人截包了,你如何防止数据恶意提交?
答:我们可以在接口传输参数里面设置一个业务编号,这个编号用来区分是否重复提交。这样即使数据被抓包了,对方也无法区分每个字段你的含义,这时,这个业务编号的作用就来了
2、假设服务器经常宕机,你从哪些方面去排查问题?
答:这个就留个各位看官补充了,可评论回复
总而言之该看的还是得看,还学的还是得学。再次强调,基础很重要!面试技巧同样很重要,还是那句话:祝愿各位看官都能找到心仪的工作吧~~
另外,奉劝大家不要频繁跳槽,这些知识点能提升固然好,不要盲目跳槽,找工作很累的,而且没有哪家公司喜欢频繁跳槽的员工
Java程序猿跳槽应该学哪些方面的技术
互联网产品、大型企业级项目常会用到的:
并发处理技术。具体到Java上通常是涉及java.util.concurrent、并发锁机制、NIO等方面,当然最近比较火爆的Netty框架也可以作为高并发处理的备选方案之一,这需要对Java的线程调度机制有着比较深的理解。不过这些可能会涉及并发控制的对象(比如reentrantlock等)只能存在于一个JVM里的问题,一旦系统规模大到需要部署多个JVM来处理并发的情况,则需要采用共享session的技术(比如spring-session),或者尽可能将系统后台设计为无状态的服务,这需要对RESTful有着较深的理解。
高可用、负载均衡技术。互联网产品、企业级应用通常要求一年里的Downtime控制在很小的范围内,这需要足够的高可用和负载均衡架构来支撑,这个一般和Java技术本身没太大关系,但却是一名初级程序员向高级程序员甚至是架构师CIO进阶的必备技术,因此可以适当了解一下Nginx、HAProxy等对这方面的支持。另外现在最“时髦”的做法是将应用docker化,配合ETCD、kubernetes等工具在容器的层面上实现高可用和负载均衡,当然这需要看实际的需求,最时髦的不见得是最适用的,要考虑构建成本。
缓存技术。缓存应该是大型系统中或高并发条件下提高响应速度的亘古不变的真理(虽然也看到过淘宝搜索商品功能采用的大数据处理技术实现的零缓存的文章,但能达到淘宝的体量和技术水平一般不太可能),群号:468897908高级架构群 备注好信息!这方面的工具太多了,ehcache、memcached、redis……从Java的角度来讲,需要了解的一是Java对这些工具的连接器,二是缓存技术背后的JSR-107标准,可以参考spring-cache的实现,阅读一下源码加深理解。
异步处理技术。这通常也是抵消高并发的处理手段之一,从Java的角度看最简单的异步处理就是新启动一个异步线程,这同样也需要对Java的线程调度有所了解,当然也可使用Spring中的@Async之类的也可以简单实现异步线程的处理。如果是非常消耗资源的业务处理,简单的异步线程是满足不了需求的,这就需要一些消息中间件来做这些异步处理了,消息中间件有很多,activemq、rabbitmq、kafka……需要了解的是Java对这些中间件的连接器。不过异步处理中最关键的是事务保证的问题,这可能需要对事务的两步提交有所了解。
在这里我有一个专门为跳槽JAVA开发人员想要跳槽准备的一个线路图:
一共分为5大专题:
工程化专题:
源码分析:
分布式/高可用/高并发专题:
双十一架构:
性能优化:
2. 防晒霜会进入血液吗?
炎热的夏天来了,太阳晒得老厉害了!
很多爱美的女性和我一样,每天都会涂抹防晒霜。
但是,很多美女又会担心,防晒霜的成分会进入血液吗?安全吗?
我认为:
防晒霜中的某些化学防晒成分,是肯定会进入血液的!但是否会对身体产生毒害,尚不明确!迄今还没有足够的证据!
防晒霜中的防晒成分主要有哪几类① 物理防晒成分
比如:二氧化钛,氧化锌……
②化学防晒成分
比如:阿伏苯宗、氧苯酮、奥克利林、依莰舒、水杨酸辛酯、肉桂酸辛酯……
化学防晒成分为什么能进入血液而物理防晒成分通常不会化学防晒成分的作用机理
化学防晒成分,是极具活性的成分,是可以被肌肤的细胞吸收的。
它的防晒作用机理是:
借助于其他成膜性物质,比如,皮肤的细胞组织,生成可以吸收紫外线的屏障,以免紫外线深入肌肤内部,伤害肌肤。
从原则上来讲,被细胞吸收的化学防晒成分,正常情况下,可以通过皮肤自身的血液循环、新陈代谢来排除体外。
化学防晒成分是怎样进入血液当中的
皮肤的真皮层中存在着大量的毛细血管,毛细血管还有扩张的功能。
当皮肤的表皮受到物理因素、化学因素,等等的影响时,真皮层中的毛细血管就可能向上扩张至表皮层。
比如:长期遭受太阳暴晒、过度去角质、涂抹铅汞去斑霜,导致面部泛红,甚至出现红血丝。
表皮层中细胞组织可以通过组织液与毛细血管中的血液进行物质交换的!在这个交换的过程中,细胞吸收的化学防晒剂成分也随之进入了血液。
据网传,美国食品药品监督管理局FDA,也专门组织志愿者做了实验,就是把防晒霜大剂量、大面积地涂抹在志愿者的皮肤上,结果发现志愿者的血液中,有超剂量的化学防晒剂成分。
物理防晒成分为什么不会进入血液
物理防晒成分,它是不会被皮肤吸收的。
它附着在皮肤表面,形成一层防护屏障,像镜子一样把紫外线反射出去。
它不可能参与人体内部的血液循环和新陈代谢。
进入血液中的化学成分有毒吗①据网传,美国FDA至今并没有发现这些化学成分,对人体有毒害。
只是发现在大面积、大剂量涂抹防晒霜,等条件下,志愿者血液中的血浆浓度阈值,超过了FDA此前建议的正常值0.5ng/ml。
至于究竟会对身体产生什么不良影响,至今没有佐证。
②我们经常涂抹防晒霜的面积较小,剂量也相对要小得多。
③皮肤自身的血液循环和新陈代谢,可以代谢掉很大一部分化学防晒成分。
所以,大家在使用防晒霜的同时,也不必过于担心。
不过,还是要记得选择有"特殊用途化妆品批准文号:国妆特字号"的隔离防晒霜。
如果有美女实在是太担心啦,你也可以选择使用以氧化锌、二氧化钛为主要防晒剂的隔离防晒霜。
这两种物理防晒成分,已经被世界公认为非常安全的防晒成分!
绝对不会进入血液,危害健康!
回答完毕!欢迎评判、关注!
我是优质美妆领域创作者枫叶红唇。
3. 如何优化数据库的连接速度和查询速度?
sql提高查询效率
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在where及orderby涉及的列上建立索引。
2.应尽量避免在where子句中对字段进行null值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
selectidfromtwherenumisnull
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
selectidfromtwherenum=0
3.应尽量避免在where子句中使用!=或操作符,否则将引擎放弃使用索引而进行全表扫描。
4.应尽量避免在where子句中使用or来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
selectidfromtwherenum=10ornum=20
可以这样查询:
selectidfromtwherenum=10
unionall
selectidfromtwherenum=20
5.in和notin也要慎用,否则会导致全表扫描,如:
selectidfromtwherenumin(1,2,3)
对于连续的数值,能用between就不要用in了:
selectidfromtwherenumbetween1and3
6.下面的查询也将导致全表扫描:
selectidfromtwherenamelike'%abc%'
若要提高效率,可以考虑全文检索。
7.如果在where子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:
selectidfromtwherenum=@num
可以改为强制查询使用索引:
selectidfromtwith(index(索引名))wherenum=@num
8.应尽量避免在where子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:
selectidfromtwherenum/2=100
应改为:
selectidfromtwherenum=100*2
9.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:
selectidfromtwheresubstring(name,1,3)='abc'--name以abc开头的id
selectidfromtwheredatediff(day,createdate,'2005-11-30')=0--‘2005-11-30’生成的id
应改为:
selectidfromtwherenamelike'abc%'
selectidfromtwherecreatedate>='2005-11-30'andcreatedate
10.不要在where子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
11.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
12.不要写一些没有意义的查询,如需要生成一个空表结构:
selectcol1,col2into#tfromtwhere1=0
这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样:
createtable#t(...)
13.很多时候用exists代替in是一个好的选择:
selectnumfromawherenumin(selectnumfromb)
用下面的语句替换:
selectnumfromawhereexists(select1frombwherenum=a.num)
14.并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。
15.索引并不是越多越好,索引固然可以提高相应的select的效率,但同时也降低了insert及update的效率,因为insert或update时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
16.应尽可能的避免更新clustered索引数据列,因为clustered索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。若应用系统需要频繁更新clustered索引数据列,那么需要考虑是否应将该索引建为clustered索引。
17.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
18.尽可能的使用varchar/nvarchar代替char/nchar,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
19.任何地方都不要使用select*fromt,用具体的字段列表代替“*”,不要返回用不到的任何字段。
20.尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。
21.避免频繁创建和删除临时表,以减少系统表资源的消耗。
22.临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一次性事件,最好使用导出表。
23.在新建临时表时,如果一次性插入数据量很大,那么可以使用selectinto代替createtable,避免造成大量log,以提高速度;如果数据量不大,为了缓和系统表的资源,应先createtable,然后insert。
24.如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先truncatetable,然后droptable,这样可以避免系统表的较长时间锁定。
25.尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。
26.使用基于游标的方法或临时表方法之前,应先寻找基于集的解决方案来解决问题,基于集的方法通常更有效。
27.与临时表一样,游标并不是不可使用。对小型数据集使用FAST_FORWARD游标通常要优于其他逐行处理方法,尤其是在必须引用几个表才能获得所需的数据时。在结果集中包括“合计”的例程通常要比使用游标执行的速度快。如果开发时间允许,基于游标的方法和基于集的方法都可以尝试一下,看哪一种方法的效果更好。
28.在所有的存储过程和触发器的开始处设置SETNOCOUNTON,在结束时设置SETNOCOUNTOFF。无需在执行存储过程和触发器的每个语句后向客户端发送DONE_IN_PROC消息。
29.尽量避免大事务操作,提高系统并发能力。
30.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理
1、避免将字段设为“允许为空”
2、数据表设计要规范
3、深入分析数据操作所要对数据库进行的操作
4、尽量不要使用临时表
5、多多使用事务
6、尽量不要使用游标
7、避免死锁
8、要注意读写锁的使用
9、不要打开大的数据集
10、不要使用服务器端游标
11、在程序编码时使用大数据量的数据库
12、不要给“性别”列创建索引
13、注意超时问题
14、不要使用Select*
15、在细节表中插入纪录时,不要在主表执行SelectMAX(ID)
16、尽量不要使用TEXT数据类型
17、使用参数查询
18、不要使用Insert导入大批的数据
19、学会分析查询
20、使用参照完整性
21、用INNERJOIN和LEFTJOIN代替Where
提高SQL查询效率(要点与技巧):
·技巧一:
问题类型:ACCESS数据库字段中含有日文片假名或其它不明字符时查询会提示内存溢出。
解决方法:修改查询语句
sql="select*fromtablenamewherecolumnlike'%"&word&"%'"
改为
sql="select*fromtablename"
rs.filter="columnlike'%"&word&"%'"
===========================================================
技巧二:
问题类型:如何用简易的办法实现类似百度的多关键词查询(多关键词用空格或其它符号间隔)。
解决方法:
'//用空格分割查询字符串
ck=split(word,"")
'//得到分割后的数量
sck=UBound(ck)
sql="select*tablenamewhere"
在一个字段中查询
Fori=0Tosck
SQL=SQL&tempJoinWord&"("&_
"columnlike'"&ck(i)&"%')"
tempJoinWord="and"
Next
在二个字段中同时查询
Fori=0Tosck
SQL=SQL&tempJoinWord&"("&_
"columnlike'"&ck(i)&"%'or"&_
"column1like'"&ck(i)&"%')"
tempJoinWord="and"
Next
===========================================================
技巧三:大大提高查询效率的几种技巧
1.尽量不要使用or,使用or会引起全表扫描,将大大降低查询效率。
2.经过实践验证,charindex()并不比前面加%的like更能提高查询效率,并且charindex()会使索引失去作用(指sqlserver数据库)
3.columnlike'%"&word&"%'会使索引不起作用
columnlike'"&word&"%'会使索引起作用(去掉前面的%符号)
(指sqlserver数据库)
4.'%"&word&"%'与'"&word&"%'在查询时的区别:
比如你的字段内容为一个容易受伤的女人
'%"&word&"%':会通配所有字符串,不论查“受伤”还是查“一个”,都会显示结果。
'"&word&"%':只通配前面的字符串,例如查“受伤”是没有结果的,只有查“一个”,才会显示结果。
5.字段提取要按照“需多少、提多少”的原则,避免“select*”,尽量使用“select字段1,字段2,字段3........”。实践证明:每少提取一个字段,数据的提取速度就会有相应的提升。提升的速度还要看您舍弃的字段的大小来判断。
6.orderby按聚集索引列排序效率最高。一个sqlserver数据表只能建立一个聚集索引,一般默认为ID,也可以改为其它的字段。
7.为你的表建立适当的索引,建立索引可以使你的查询速度提高几十几百倍。(指sqlserver数据库)
·以下是建立索引与不建立索引的一个查询效率分析:
Sqlserver索引与查询效率分析。
表News
字段
Id:自动编号
Title:文章标题
Author:作者
Content:内容
Star:优先级
Addtime:时间
记录:100万条
测试机器:P42.8/1G内存/IDE硬盘
=======================================================
方案1:
主键Id,默认为聚集索引,不建立其它非聚集索引
select*fromNewswhereTitlelike'%"&word&"%'orAuthorlike'%"&word&"%'orderbyIddesc
从字段Title和Author中模糊检索,按Id排序
查询时间:50秒
=======================================================
方案2:
主键Id,默认为聚集索引
在Title、Author、Star上建立非聚集索引
select*fromNewswhereTitlelike'"&word&"%'orAuthorlike'"&word&"%'orderbyIddesc
从字段Title和Author中模糊检索,按Id排序
查询时间:2-2.5秒
=======================================================
方案3:
主键Id,默认为聚集索引
在Title、Author、Star上建立非聚集索引
select*fromNewswhereTitlelike'"&word&"%'orAuthorlike'"&word&"%'orderbyStardesc
从字段Title和Author中模糊检索,按Star排序
查询时间:2秒
=======================================================
方案4:
主键Id,默认为聚集索引
在Title、Author、Star上建立非聚集索引
select*fromNewswhereTitlelike'"&word&"%'orAuthorlike'"&word&"%'
从字段Title和Author中模糊检索,不排序
查询时间:1.8-2秒
=======================================================
方案5:
主键Id,默认为聚集索引
在Title、Author、Star上建立非聚集索引
select*fromNewswhereTitlelike'"&word&"%'
或
select*fromNewswhereAuthorlike'"&word&"%'
从字段Title或Author中检索,不排序
查询时间:1秒
·如何提高SQL语言的查询效率?
问:请问我如何才能提高SQL语言的查询效率呢?
答:这得从头说起:
由于SQL是面向结果而不是面向过程的查询语言,所以一般支持SQL语言的大型关系型数据库都使用一个基于查询成本的优化器,为即时查询提供一个最佳的执行策略。对于优化器,输入是一条查询语句,输出是一个执行策略。
一条SQL查询语句可以有多种执行策略,优化器将估计出全部执行方法中所需时间最少的所谓成本最低的那一种方法。所有优化都是基于用记所使用的查询语句中的where子句,优化器对where子句中的优化主要用搜索参数(SerachArgument)。
搜索参数的核心思想就是数据库使用表中字段的索引来查询数据,而不必直接查询记录中的数据。
带有=、、>=等操作符的条件语句可以直接使用索引,如下列是搜索参数:
emp_id="10001"或salary>3000或a=1andc=7
而下列则不是搜索参数:
salary=emp_salary或dep_id!=10或salary*12>=3000或a=1orc=7
应当尽可能提供一些冗余的搜索参数,使优化器有更多的选择余地。请看以下3种方法:
第一种方法:
selectemployee.emp_name,department.dep_namefromdepartment,employeewhere(employee.dep_id=department.dep_id)and(department.dep_code="01")and(employee.dep_code="01");
它的搜索分析结果如下:
Estimate2I/Ooperations
Scandepartmentusingprimarykey
forrowswheredep_codeequals"01"
Estimategettinghere1times
Scanemployeesequentially
Estimategettinghere5times
第二种方法:
selectemployee.emp_name,department.dep_namefromdepartment,employeewhere(employee.dep_id=department.dep_id)and(department.dep_code="01");
它的搜索分析结果如下:
Estimate2I/Ooperations
Scandepartmentusingprimarykey
forrowswheredep_codeequals"01"
Estimategettinghere1times
Scanemployeesequentially
Estimategettinghere5times
第一种方法与第二种运行效率相同,但第一种方法最好,因为它为优化器提供了更多的选择机会。
第三种方法:
selectemployee.emp_name,department.dep_namefromdepartment,employeewhere(employee.dep_id=department.dep_id)and(employee.dep_code="01");
这种方法最不好,因为它无法使用索引,也就是无法优化……
使用SQL语句时应注意以下几点:
1、避免使用不兼容的数据类型。例如,Float和Integer,Char和Varchar,Binary和LongBinary不兼容的。数据类型的不兼容可能使优化器无法执行一些本可以进行的优化操作。例如:
selectemp_nameformemployeewheresalary>3000;
在此语句中若salary是Float类型的,则优化器很难对其进行优化,因为3000是个整数,我们应在编程时使用3000.0而不要等运行时让DBMS进行转化。
2、尽量不要使用表达式,因它在编绎时是无法得到的,所以SQL只能使用其平均密度来估计将要命中的记录数。
3、避免对搜索参数使用其他的数学操作符。如:
selectemp_namefromemployeewheresalary*12>3000;
应改为:
selectemp_namefromemployeewheresalary>250;
4、避免使用!=或等这样的操作符,因为它会使系统无法使用索引,而只能直接搜索表中的数据。
·ORACAL中的应用
一个1600万数据表--短信上行表TBL_SMS_MO
结构:
CREATETABLETBL_SMS_MO
(
SMS_IDNUMBER,
MO_IDVARCHAR2(50),
MOBILEVARCHAR2(11),
SPNUMBERVARCHAR2(20),
MESSAGEVARCHAR2(150),
TRADE_CODEVARCHAR2(20),
LINK_IDVARCHAR2(50),
GATEWAY_IDNUMBER,
GATEWAY_PORTNUMBER,
MO_TIMEDATEDEFAULTSYSDATE
);
CREATEINDEXIDX_MO_DATEONTBL_SMS_MO(MO_TIME)
PCTFREE10
INITRANS2
MAXTRANS255
STORAGE
(
INITIAL1M
NEXT1M
MINEXTENTS1
MAXEXTENTSUNLIMITED
PCTINCREASE0
);
CREATEINDEXIDX_MO_MOBILEONTBL_SMS_MO(MOBILE)
PCTFREE10
INITRANS2
MAXTRANS255
STORAGE
(
INITIAL64K
NEXT1M
MINEXTENTS1
MAXEXTENTSUNLIMITED
PCTINCREASE0
);
问题:从表中查询某时间段内某手机发送的短消息,如下SQL语句:
SELECTMOBILE,MESSAGE,TRADE_CODE,MO_TIME
FROMTBL_SMS_MO
WHEREMOBILE='130XXXXXXXX'
ANDMO_TIMEBETWEENTO_DATE('2006-04-01','YYYY-MM-DDHH24:MI:SS')ANDTO_DATE('2006-04-07','YYYY-MM-DDHH24:MI:SS')
ORDERBYMO_TIMEDESC
返回结果大约需要10分钟,应用于网页查询,简直难以忍受。
分析:
在PL/SQLDeveloper,点击“ExplainPlan”按钮(或F5键),对SQL进行分析,发现缺省使用的索引是IDX_MO_DATE。问题可能出在这里,因为相对于总数量1600万数据来说,都mobile的数据是很少的,如果使用IDX_MO_MOBILE比较容易锁定数据。
如下优化:
SELECT/*+index(TBL_SMS_MOIDX_MO_MOBILE)*/MOBILE,MESSAGE,TRADE_CODE,MO_TIME
FROMTBL_SMS_MO
WHEREMOBILE='130XXXXXXXX'
ANDMO_TIMEBETWEENTO_DATE('2006-04-01','YYYY-MM-DDHH24:MI:SS')ANDTO_DATE('2006-04-07','YYYY-MM-DDHH24:MI:SS')
ORDERBYMO_TIMEDESC
测试:
按F8运行这个SQL,哇~......2.360s,这就是差别。
http://www.cnblogs.com/ShaYeBlog/archive/2013/07/31/3227244.html
4. 摄影一定需要滤镜吗?
滤镜,一般主要针对于单反相机的镜头,卡片相机和微单相机真的没有任何必要去搭配一个滤镜。现在的摄影用户中,购买滤镜主要是为了保护昂贵的单反镜头,也就是UV镜。而购买其他滤镜的用户其实并不是特别常见。那么到底滤镜这个产品是不是鸡肋,我们摄影时候需要使用到滤镜吗?
上面已经提到了,目前市面上出镜率最高的滤镜当属UV镜,笔者身边很多朋友都在使用UV镜。UV镜最大的用途除了过滤紫外线,就是保护镜头,而且大部分购买UV镜的用户都是为了保护镜头。UV镜自然也有好坏之分,质量优秀的UV镜可以保护镜头、过滤紫外线,质量较差的UV镜会降低画质,严重影响到用户的拍照体验。在我们日常拍摄的时候,由于并不是每一天都是万里无云、天空湛蓝,因此我们有的时候拍摄的天空并不那么蓝,这时候可以使用偏振滤镜去解决问题。我们常见的CPL滤镜就是偏振滤镜。偏振滤镜的作用是过滤偏振光,让蓝天更蓝,让透过玻璃拍摄的时候不会被反光影响。同样的,劣质的偏振滤镜会影响画质,而且在使用时,用户也需要调整偏振滤镜的角度进行拍摄。
下面发一些图片给大家看
很好的利用光和影。希望对你有用
图片来源于网络
觉得好的就点赞吧!