君哥聊技术

京东给 offer 了,月薪没涨,年终多了 5 个月![面试题]

大家好,我是君哥。

最近一个朋友收到京东 offer,薪资涨幅达到 30%。说实话,在现在大环境不好的情况下,这个涨幅很给力了,要知道不少人换工作平薪甚至降薪。

本来是一件很高兴的事情,但朋友心里有点忐忑。

朋友目前薪资 30k,公司年终 3 个月,一般能给满。京东给的薪资也是 30k,但是年终是 8 个月,这么算年包的涨幅确实达到 30%。

可是年终 8 个月,这个到底能不能给满,不太能确定。我也帮他问几个内部的朋友,大家倒是说一般能给满。京东这几年工资上升真的是很快,也就两年,工资涨了好几次,年终涨到了 8 个月。这对于老员工的确是好事,大家月薪没降,年终多了,妥妥的涨薪啊。但对于新人就不太友好了,我认识好几个朋友,新入职,年薪给的都不低,但是一平均到 20 个月,月薪一下子就降下来了。比如年包 60w,别的公司可能月薪 40k,但京东月薪只有 30k。

新人担心的问题几乎都一样:

1.年终到底能拿到几个月;

2.会不会因为干的不好,领导给的绩效差,拿的很少甚至拿不到;

3.中间离职的话,年终会按当年工作几个月这样的比例兑现吗;

4.裁员的话 ,除了 N+1,年终是否也能给补上。

确实,打工人挣点钱太不容易了,又要加班又要通宵的。工资一大部分放到年终,带来的不确定因素太多了。

下面,分享一道京东面试题:MySQL 内存表和临时表有什么区别呢?

1.概念

临时表用来给复杂查询保存中间结果,分为内部临时表和外部临时表。

  • 内部临时表:MySQL 内部生成,比如 union 语句、group by 语句可以保存中间结果;
  • 外部临时表:由客户端创建,SQL 语法:CREATE TEMPORARY TABLE。

内存表是指使用 Memory 存储引擎的表,创建语句如下图:

createtable test_memory(`id`int, `a`VARCHAR(20) DEFAULTNULL, PRIMARY KEY (`id`)) engine=Memory; 

内存表可以给所有客户端看到,客户端连接关闭后不影响内存表。但如果 MySQL 重启服务,内存表的数据会丢失,表结构还在。

可以看到,临时表也可以是内存表。

2.生命周期

临时表是会话级别的,客户端连接关闭后,临时表自动删除。同时,会话之间的临时表是相互隔离的,不同会话可以创建相同名称的临时表。

内存表则不受会话的影响,只有使用 drop 才能删除掉。

3.存储

临时表可以使用各种存储引擎,比如 InnoDB、MyISAM 或者 MEMORY。创建时使用 ENGINE = xxx 来指定。如果临时表使用的存储引擎是 MEMORY(内存临时表),则会受下面参数限制:

  • tmp_table_size:临时表的最大内存值;
  • max_heap_table_size:临时表的最大堆内存值,主要用来计算临时表的最大行数。

内存临时表的内存不能超过上面两个参数最小值的,如果超出,则会转化成磁盘临时表,查询效率下降。

内存表的数据存储在内存中。如果服务重启,或者内存不足,数据会丢失。

4.索引方式

内存表默认使用 hash 索引,不支持范围扫描或排序。

临时表则根据选择的存储引擎,支持的索引类型不同。如果选择 Innodb,则支持 B+ 树索引,支持事务,支持行级锁。

5.使用场景

内存表主要用于数据量较小、需要快速访问、允许数据丢失的场景。

临时表则用于单个会话中需要保存临时结果,会话结束可以自动清理的场景。比如 union、group by 语句。

下面看一下 union 语句执行过程,测试 SQL 如下: 先创建两个表:

CREATETABLE test_temp1(`id`INT, `a`VARCHAR(20) DEFAULTNULL, PRIMARY KEY (`id`)) ENGINE=INNODB; 
CREATETABLE test_temp2(`id`INT, `a`VARCHAR(20) DEFAULTNULL, PRIMARY KEY (`id`)) ENGINE=INNODB; 

然后执行查询语句:

SELECT * FROM test_temp1 UNIONSELECT * FROM test_temp2;

从执行计划 Extra 可以看出,查询语句用到了临时表。

Image

这个语句执行过程如下:

1.创建一个内存临时表,这个临时表有 2 个字段,id 和 a,其中 id 为主键;

2.执行第一个子查询,获取 test_temp1 的所有记录,放到临时表中;

3.执行第二个子查询,获取 test_temp2 表的所有记录,依次插入临时表中,如果有主键冲突,则失败,继续插入下一条;

4.将临时表中数据作为结果集返回;

5.删除临时表。

6.总结

下面总结内存表和临时表的区别:

特性
内存表
临时表
存储引擎
Memory
可以选择 Memory、InnoDB、MyISAM
生命周期
表结构持久化,不重启服务,数据不会丢失
会话结束,删除表
索引方式
默认hash索引
根据存储引擎支持不同类型
使用场景
数据量较小、需要快速访问、允许数据丢失
保存临时结果
往期精彩:
又老性能又差,为什么好多公司依然选择 RabbitMQ?

45 个知识点,带你入门消息队列!

引入了 Disruptor 后,系统性能大幅提升!

阿里二面:聊聊 MySQL 主从同步方案的优缺点

面试官:MySQL双主架构有什么优缺点?

面试官:使用 MySQL 时你遇到过哪些索引失效的场景

面试官:MySQL表中有2千万条数据,B+树层高是多少?

面试官:MySQL JOIN 表太多,你有哪些优化思路?

感谢阅读,如果对你有帮助,请点赞和在看。欢迎加我微信:zhujinjun86。

号内回复 seata,下载《阿里分布式中间件Seata从入门到精通》

号内回复 beijing,下载我总结的北京上百家知名科技公司

号内回复 aqs,下载《40张图精通Java AQS》