职场永远都是看似风平浪静,春风和煦,领导频繁表扬你,同事都更加殷勤,可是,千万不要被这些人间仙境迷惑,可能不是什么仙境,而是雾霾来袭了。如果突然遇到这种情况,那么要警惕,是不是你的职场遇到了什么问题,比如有种东西叫做瓶颈。而领导准备怎样应对你的瓶颈,是另辟天地,还是另请高明。这个时期,心明眼亮点吧,不然你可能会被边缘了而不自知。
职场瓶颈,相信很多人都遭遇过,就跟女人的生理期一样,没人能始终高歌猛进,江郎不是也会才尽吗?这时候,真是考验管理者的时刻。好的管理者,会思考一下个人的瓶颈期,是个人原因,还是公司原因。如果是个人问题,如何能帮他打碎壁垒,再造辉煌,如果是公司原因阻碍了个人职业发展,那么,公司是不是有必要战略转型了。可是,别做梦了,快醒醒,给你讲个奇葩领导的故事。
奇葩这个物种,我觉得好像,总喜欢成对出现。真是无巧不成双,咳咳,好像哪里不对?
几年前,我在一家在北京很知名的培训机构做市场营销工作,这是我职业生涯的第一次转型。也是人生的一个低谷时期。不过我很快就适应了这份工作,而且应该说还是有些成就的。因为,一年后,就不断有其他培训机构的人来挖我,包括新东方这样的机构。可是,我很快遭遇了瓶颈期,怎么都没动力,业绩也是半死不活,市场总监来跟我谈,我当时很真诚地说,领导,我已经尽力了。然后我们的谈话就在愉快地氛围中结束了。
其实,我心里门儿清,为啥我没动力,因为钱没给到位啊。我来应聘的时候,谈好了卖身契,基本工资就是个虚数,主要跟业绩挂钩,定了指标,双方签字画押。结果,三个月后她发现我拿的提成远远超过了其他人,这时候她是不是应该偷着乐呢,花了很少的钱请了个能干活的主儿?我拿的工资越高,说明给公司带来的收益越高啊。并没有,这时候这位总监大人跟所谓董事会一商量,三个月试用期一结束,基本工资涨了一些,同时把指标额度提升了50%!我当时很不爽啊,可是我忍了。你知道这位总监大人给我的理由是啥嘛?因为你刚入行,我怕你有压力,所以试用期就降低了要求。妈蛋,明明当时谈的是年度目标好伐?这之后就是,一年内指标额度一共提了四次。三个月一次,跟大姨妈一样准呢。而我和我的团队依旧拿着越来越高的工资。在她第五次把我的业绩指标额度提高后,我有点怒了,瓶颈期开始了,我连续三个月都是只完成刚刚好够指标,之后总监大人就找我谈话了。
那次谈话之后,总监大人对我始终和颜悦色,我也始终笑脸相迎,大家在从未有过的和谐气氛中剑拔弩张。她开始频繁安排面试,而我,也开始和其他机构的人资接触。当然我的接触是悄悄进行的,而她的面试却是藏不住的。
没几天,公司来了一个高大帅气的男生,跟我岗位相同。然后在第一次市场部会议时候,就忍不住一顿夸赞,觉得这个男生提的很多思路特别有前瞻性,有创造性,有独特性,blablabla,说得我们几个经理尴尬症都快翻了,我心想这位总监大人是被灌了什么迷魂汤了,思路是很好啊,唯一的缺点是,没有可行性。而且我不知道为什么第一眼就觉得这男生虽然英俊,但是眉眼之间透着一种让人很不舒服的轻浮劲儿。
更让我尴尬的是,总监大人安排他先跟着我们组。还说,让我多配合他,我呸,论资历,我也是老人,来个新人摆明了要顶替我,来了就让我配合,你直接让我走人也算是给我留些面子好伐,不过我太清楚她的心思,以我的个性绝不会甘为人下认怂让位的,一定会主动辞职,这样他就省了一大笔赔偿金。女人心,果然歹毒的嘞。我手底下的小朋友们那也是脑子灵光,惯会见风使舵,再加上确实颜值不错,的确给女生泛滥的公司带来了一些别样风光。姑娘们站队站得特别快。
我那时,其实已经跟另一家机构谈好了,那边几乎一天一个电话追着我快点去报道,因为寒假招生旺季马上到了。可是我就很想看看新来的这位到底是何方神圣。我跟这小伙子单独开过一次小会,这一次会后,我确认了一点,就是,总监大人一定是找了个假的经理,另外还印证了我之前的感觉,这小伙子不只是轻浮,还是人品问题。他居然有意无意碰我的手,还打听我是否单身,并在第一个周末就给我打电话约我出去吃饭。约你妹啊,难道我那时候长了一张缺爱的脸吗?
然后我找人资的小姑娘要了这个人的简历,以人资的名义给这人此前就职的公司打了个电话,做了个背景调查。然后,发现这家伙果然满嘴谎话,两家公司工作时间都没超过一年,而且都是因为业绩太烂没辞退了。确认了这一点,我就放心地提交了辞职报告。
总监假意挽留,实则顺水推舟,还问我以后什么打算?我说要游山玩水休息一番。其实第二天就去新公司报到了。
一个月后,这位总监大人突然给我打电话,我心想,恩,一个月才发现新招的小伙子不行,还不算太迟钝。果然,东扯西扯扯到要请我去清华园里看话剧,拜托,我跟你共事一年多,你都没单独请我吃过一餐饭,现在倒好到要请我看话剧了?好呀,好久没见你了,也怪想念的,我满口答应。
话剧看完了,饭也吃完了,该说的话终究还是得说。
“那个谁谁?你还记得不?”当然记得啊,你踅摸来顶替我的人选。
”有印象,长得挺帅的。“我一脸笑意。
“那人已经被我辞退了。”
“啊?为什么啊?不是挺好的吗?”当初他粉墨登场时候您可也是卖力吹捧过得啊。
“那人不行,能力太差。”
“哦,那太可惜了,白瞎那张脸了。”
“M,你也休息这么长时间,回来上班吧?”
“哦。不好意思啊,这周一刚刚入职了呢。”
”是吗?哪家公司?“
当我说出公司名字时,看着前总监大人诧异得有点扭曲的脸,一种愉悦感忽然涌上心头。她一定很后悔,当初没跟我签过竞业限制协议,不过,以她的智商,可能压根就不知道这是个啥东西。
这位前总监大人至今居然还始终关注着我的微信,时不时给我点个赞鼓个掌,有天还曾经留言,如果在新公司做得不开心,随时欢迎你回来。拜你所赐,我已经学会了把所有的条件都谈清楚白纸黑字,这样的工作,即便辛苦,也不会不开心。
篇幅所限本文只写了MySQL25题,像其他的Redis,SSM框架,算法,计网等技术栈的面试题后面会持续更新,个人整理的1000余道面试八股文会放在文末给大家白嫖,最近有面试需要刷题的同学可以直接翻到文末领取。
如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置, 频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE(optimize table)来重建表并优化填充页面。
Server层按顺序执行sql的步骤为:
简单概括:
可以分为服务层和存储引擎层两部分,其中:
服务层包括连接器、查询缓存、分析器、优化器、执行器等 ,涵盖MySQL的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
存储引擎层负责数据的存储和提取 。其架构模式是插件式的,支持InnoDB、MyISAM、Memory等多个存储引擎。现在最常用的存储引擎是InnoDB,它从MySQL 555版本开始成为了默认的存储引擎。
Drop、Delete、Truncate都表示删除,但是三者有一些差别:
Delete 用来删除表的全部或者一部分数据行,执行Delete之后,用户需要提交(commmit)或者回滚(rollback)来执行删除或者撤销删除,会触发这个表上所有的delete触发器。
Truncate 删除表中的所有数据,这个操作不能回滚,也不会触发这个表上的触发器,TRUNCATE比Delete更快,占用的空间更小。
Drop 命令从数据库中删除表,所有的数据行,索引和权限也会被删除,所有的DML触发器也不会被触发,这个命令也不能回滚。
因此,在不再需要一张表的时候,用Drop;在想删除部分数据行时候,用Delete;在保留表而删除所有数据的时候用Truncate。
隔离级别脏读不可重复读幻影读 READ-UNCOMMITTED 未提交读 READ-COMMITTED 提交读 REPEATABLE-READ 重复读 SERIALIZABLE 可串行化读
MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ (可重读)
这里需要注意的是 :与 SQL 标准不同的地方在于InnoDB 存储引擎在 REPEATABLE-READ(可重读)事务隔离级别 下使用的是 Next-Key Lock 锁 算法,因此可以避免幻读的产生,这与其他数据库系统(如 SQL Server)是不同的。所以 说InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读) 已经可以完全保证事务的隔离性要 求,即达到了 SQL标准的SERIALIZABLE(可串行化)隔离级别。
因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是READ-COMMITTED(读取提交内 容):,但是你要知道的是InnoDB 存储引擎默认使用 REPEATABLE-READ(可重读)并不会有任何性能损失 。
InnoDB 存储引擎在分布式事务 的情况下一般会用到SERIALIZABLE(可串行化)隔离级别。
主要原因:B+树只要遍历叶子节点就可以实现整棵树的遍历,而且在数据库中基于范围的查询是非常频繁的,而B树只能中序遍历所有节点,效率太低。
文件与数据库都是需要较大的存储,也就是说,它们都不可能全部存储在内存中,故需要存储到磁盘上。而所谓索引,则为了数据的快速定位与查找,那么索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数,因此B+树相比B树更为合适。数据库系统巧妙利用了局部性原理与磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入,而红黑树这种结构,高度明显要深的多,并且由于逻辑上很近的节点(父子)物理上可能很远,无法利用局部性。
最重要的是,B+树还有一个最大的好处:方便扫库。
B树必须用中序遍历的方法按序扫库,而B+树直接从叶子结点挨个扫一遍就完了,B+树支持range-query非常方便,而B树不支持,这是数据库选用B+树的最主要原因。
B+树查找效率更加稳定,B树有可能在中间节点找到数据,稳定性不够。
B+tree的磁盘读写代价更低:B+tree的内部结点并没有指向关键字具体信息的指针(红色部分),因此其内部结点相对B 树更小。如果把所有同一内部结点的关键字存放在同一块盘中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多,相对来说IO读写次数也就降低了;
B+tree的查询效率更加稳定:由于内部结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引,所以,任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当;
视图是一种虚拟的表,通常是有一个表或者多个表的行或列的子集,具有和物理表相同的功能 游标是对查询出来的结果集作为一个单元来有效的处理。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。
而在 MySQL 中,恢复机制是通过回滚日志(undo log)实现的,所有事务进行的修改都会先记录到这个回滚日志中,然后在对数据库中的对应行进行写入。当事务已经被提交之后,就无法再次回滚了。
回滚日志作用:1)能够在发生错误或者用户执行 ROLLBACK 时提供回滚相关的信息 2) 在整个系统发生崩溃、数据库进程直接被杀死后,当用户再次启动数据库进程时,还能够立刻通过查询回滚日志将之前未完成的事务进行回滚,这也就需要回滚日志必须先于数据持久化到磁盘上,是我们需要先写日志后写数据库的主要原因。
InnoDB
MyISAM
总结
数据库并发会带来脏读、幻读、丢弃更改、不可重复读这四个常见问题,其中:
脏读 :在第一个修改事务和读取事务进行的时候,读取事务读到的数据为100,这是修改之后的数据,但是之后该事务满足一致性等特性而做了回滚操作,那么读取事务得到的结果就是脏数据了。
幻读 :一般是T1在某个范围内进行修改操作(增加或者删除),而T2读取该范围导致读到的数据是修改之间的了,强调范围。
丢弃修改 :两个写事务T1 T2同时对A=0进行递增操作,结果T2覆盖T1,导致最终结果是1 而不是2,事务被覆盖
不可重复读 :T2 读取一个数据,然后T1 对该数据做了修改。如果 T2 再次读取这个数据,此时读取的结果和第一次读取的结果不同。
第一个事务首先读取var变量为50,接着准备更新为100的时,并未提交,第二个事务已经读取var为100,此时第一个事务做了回滚。最终第二个事务读取的var和数据库的var不一样。
T1 读取某个范围的数据,T2 在这个范围内插入新的数据,T1 再次读取这个范围的数据,此时读取的结果和和第一次读取的结果不同。
T1 和 T2 两个事务都对一个数据进行修改,T1 先修改,T2 随后修改,T2 的修改覆盖了 T1 的修改。例如:事务1读取某表中的数据A=50,事务2也读取A=50,事务1修改A=A+50,事务2也修改A=A+50,最终结果A=100,事务1的修改被丢失。
T2 读取一个数据,T1 对该数据做了修改。如果 T2 再次读取这个数据,此时读取的结果和第一次读取的结果不同。
悲观锁,先获取锁,再进行业务操作,一般就是利用类似 SELECT … FOR UPDATE 这样的语句,对数据加锁,避免其他事务意外修改数据。当数据库执行SELECT … FOR UPDATE时会获取被select中的数据行的行锁,select for update获取的行锁会在当前事务结束时自动释放,因此必须在事务中使用。
乐观锁,先进行业务操作,只在最后实际更新数据时进行检查数据是否被更新过。Java 并发包中的 AtomicFieldUpdater 类似,也是利用 CAS 机制,并不会对数据加锁,而是通过对比数据的时间戳或者版本号,来实现乐观锁需要的版本判断。
分库与分表的目的在于,减小数据库的单库单表负担,提高查询性能,缩短查询时间。
通过分表 ,可以减少数据库的单表负担,将压力分散到不同的表上,同时因为不同的表上的数据量少了,起到提高查询性能,缩短查询时间的作用,此外,可以很大的缓解表锁的问题。分表策略可以归纳为垂直拆分和水平拆分:
水平分表 :取模分表就属于随机分表,而时间维度分表则属于连续分表。如何设计好垂直拆分,我的建议:将不常用的字段单独拆分到另外一张扩展表 将大文本的字段单独拆分到另外一张扩展表, 将不经常修改的字段放在同一张表中,将经常改变的字段放在另一张表中。对于海量用户场景,可以考虑取模分表,数据相对比较均匀,不容易出现热点和并发访问的瓶颈。
库内分表 ,仅仅是解决了单表数据过大的问题,但并没有把单表的数据分散到不同的物理机上,因此并不能减轻 MySQL 服务器的压力,仍然存在同一个物理机上的资源竞争和瓶颈,包括 CPU、内存、磁盘 IO、网络带宽等。
分库与分表带来的分布式困境与应对之策 数据迁移与扩容问题----一般做法是通过程序先读出数据,然后按照指定的分表策略再将数据写入到各个分表中。分页与排序问题----需要在不同的分表中将数据进行排序并返回,并将不同分表返回的结果集进行汇总和再次排序,最后再返回给用户。
不可重复读的重点是修改,幻读的重点在于新增或者删除。
视图是虚拟的表,与包含数据的表不一样,视图只包含使用时动态检索数据的查询;不包含任何列或数据。使用视图可以简化复杂的 sql 操作,隐藏具体的细节,保护数据;视图创建后,可以使用与表相同的方式利用它们。
视图不能被索引,也不能有关联的触发器或默认值,如果视图本身内有order by 则对视图再次order by将被覆盖。
创建视图:create view xxx as xxxx
对于某些视图比如未使用联结子查询分组聚集函数Distinct Union等,是可以对其更新的,对视图的更新将对基表进行更新;但是视图主要用于简化检索,保护数据,并不用于更新,而且大部分视图都不可以更新。
B+tree的磁盘读写代价更低,B+tree的查询效率更加稳定 数据库索引采用B+树而不是B树的主要原因:B+树只要遍历叶子节点就可以实现整棵树的遍历,而且在数据库中基于范围的查询是非常频繁的,而B树只能中序遍历所有节点,效率太低。
B+树的特点
在最频繁使用的、用以缩小查询范围的字段,需要排序的字段上建立索引。不宜:1)对于查询中很少涉及的列或者重复值比较多的列 2)对于一些特殊的数据类型,不宜建立索引,比如文本字段(text)等。
如果一个索引包含(或者说覆盖)所有需要查询的字段的值,我们就称 之为“覆盖索引”。
我们知道在InnoDB存储引 擎中,如果不是主键索引,叶子节点存储的是主键+列值。最终还是要“回表”,也就是要通过主键再查找一次,这样就 会比较慢。覆盖索引就是把要查询出的列和索引是对应的,不做回表操作!
举例 :
学号姓名性别年龄系别专业 20020612李辉男20计算机软件开发 20060613张明男18计算机软件开发 20060614王小玉女19物理力学 20060615李淑华女17生物动物学 20060616赵静男21化学食品化学 20060617赵静女20生物植物学
主键为候选键的子集,候选键为超键的子集,而外键的确定是相对于主键的。
目前称得上自媒体的平台很多,有像今日头条这样的根据用户推荐的APP,也有像腾讯这样的聚合分发到多端的综合性平台。还有像专注于一个领域比如科技或美食的平台也可以投稿。还有像爱奇艺,优酷这样的视频自媒体平台。
自媒体作品的表现形式有文章、图集(摄影)、视频、问答、小测试、小程序等。其中视频和文章是最常见的形式。
自媒体内容分类的话也是比较多的,常见的分类就是新闻、美食、军事、娱乐、搞笑、科技、数码、体育、财经、汽车、游戏、旅游等。合适个人或小团队做的比较冷门领域的领域有军事、体育、旅游、科技。新闻一般都是媒体机构承包了,财经一般要大牌的人写的东西才有人看。
大体上可以这样分:泛娱乐(包括搞笑、时尚、美女、娱乐新闻、)、泛资讯(包括社会资讯、时事评论以及各种新闻)、科技(包括数码、互联网、通信、软件、人工智能等)、旅游类(包括美食、旅游)财经、军事等内容。
有的平台还要细分成各种细分领域。比如科技就可以分成各个很多门类。包括科普、探索、软件、互联网、物联网、通信、数码、软件等。
下面给大家说说几个大平台的分类
百度百家号:财经版、文化版、娱乐版、体育版
今日头条:社会、娱乐、科技、财经、搞笑、汽车、历史、美食、军事、时尚、旅游、探索、养生、育儿、故事、美文、国际、游戏、探索等。
一点资讯就比较多了,它分得很细。比较不同其他平台的分类有:星座命理、教育、人文、科学探索、家居、商业职场等。
UC头条的分类大体是一样的,但是你注册UC号的时候选择什么领域,发布文章的时候就无法更改分类了。
如果面试时被问到spark任务如何调优,我们该如何回答呢?
下面我们从四大方面回答这个问题,保证吊打面试官。
一、spark性能调优
1、分配更多的资源
比如增加执行器个数(num_executor)、增加执行器个数(executor_cores)、增加执行器内存(executor_memory)
2、调节并行度
sparkdefaultparallelism
3、重构RDD架构以及RDD持久化
尽量去复用RDD,差不多的RDD可以抽取成一个共同的RDD,公共RDD一定要实现持久化
4、广播变量
SparkContextbroadcast方法创建一个对象,通过value方法访问
5、使用kryo序列化
SparkConf中设置属性:sparkserializer: orgapachesparkserializerkryoSerializer
6、使用fastutil优化数据格式(代替java中的Array、List、Set、Map)
7、调节数据本地化等待时长
调节参数: sparklocalitywait
二、JVM调优
降低cache操作的内存占比 16版本之前使用的是静态内存管理
spark中堆内存被划分为两块:
一块是专门来给RDD作cachepersist持久化的 StorageMemory,另一块是给spark算子函数运行使用的,存放函数中自己创建的对象。
16版本之后采用统一内存管理机制
storage和execution各占50%,若己方不足对方空余可占用对方空间
可尝试调节executor堆外内存
sparkyarnexecutormemoryOverhead = 2048m
调节连接等待时长
sparkcoreconnectionackwaittimeout = 300
三、shuffle数据倾斜调优
1、预聚合源数据,对hive源表提前进行聚合操作,在hive聚合之后,spark任务再去读取
2、检查倾斜的key是否是脏数据,可以提前过滤
3、提高shuffle操作reduce的并行度
4、使用随机key实现双重聚合
5、将reduce端 join转换成map端 join
6、sample采样倾斜key,单独进行join后在union
7、使用随机数以及扩容表进行join
四、算子调优
1、使用mapPartition提升map类操作的性能
2、filter过后使用coalesce减少分区数量
3、使用foreachPartition优化写数据性能
4、使用repartition解决sparkSql低并行度的性能问题
5、reduceByKey替换groupByKey实现map读预聚合
资源链接:https://panbaiducom/s/18-dybd4r6Uqi_N4T6sHjAgpwd=vgvb
9个表面上毫不相关的陌生人被绑架到一间房子里。一个神父,一个警察,一个舞蹈演员,还有作曲家和他的妻子,一个时装设计师,一个网球明星,一个犯人,还有一个黑人。无奈之下展开了一场相互残杀的赌命游戏:9个人被抓到了一间封闭而没有出口的屋子里,并被告知:愿与不愿都要互相展开一场人性游戏大战。唯一活着的人,就能走出这间屋子,并能获得500万美金的奖励,但也意味着要杀死其他的8个人,于是在绝望和希望并存中开始了一系列人性的大暴露。在金钱与利益面前,人,总是把持不住。
欢迎分享,转载请注明来源:品搜搜测评网