2020年开头相比往年的确是一个非常特殊的鼠年,全国上下齐心协力为武汉加油!!加油加油!!

相信有很多朋友跟我一样被困家中,不敢出门,感觉像是要发霉了,止步于家里的大门。虽如此,但是“金三银四”的春招是不会止步的,时间不等人,现在已是2月中旬啦。今天,小编给大家出些MySQL与Redis面试高频必备题,MySQL(20)与Redis(20),两个凑在一起,组个“20 20”,试试不看答案你能答对几道??

先来看看MySQL(20)

1.1 什么是MySQL?怎么学习?

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。

很多朋友不知道怎么一步一步的学习MySQL,下面就先给大家看看MySQL的一个学习路线大纲图:

(这里为了方便展示,给大家看的是截图,如需下载xmind原图已经Redis的学习路线大纲图请 “移步评论区”)

1.2 MySQL(20)高频必备题目与答案解析(先不要看答案哟~)

  • (1)事务四大特性(ACID)原子性、一致性、隔离性、持久性?

答案解析:

原子性(Atomicity)

· 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

一致性(Consistency)

· 事务开始前和结束后,数据库的完整性约束没有被破坏。比如A向B转账,不可能A扣了钱,B却没收到

隔离性(Isolation)

· 隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离

同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。

关于事务的隔离性数据库提供了多种隔离级别,稍后会介绍到持久性(Durability)

持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作

  • (2)事务的并发?事务隔离级别,每个级别会引发什么问题,MySQL默认是哪个级别?
  • (3)MySQL常见的三种存储引擎(InnoDB、MyISAM、MEMORY)的区别?

答案解析:

3.1 MySQL存储引擎MyISAM与InnoDB如何选择

MySQL有多种存储引擎,每种存储引擎有各自的优缺点,可以择优选择使用:MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。

虽然MySQL里的存储引擎不只是MyISAM与InnoDB这两个,但常用的就是两个

两种存储引擎的大致区别表现在

· InnoDB支持事务,MyISAM不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了。

· MyISAM适合查询以及插入为主的应用

· InnoDB适合频繁修改以及涉及到安全性较高的应用

· InnoDB支持外键,MyISAM不支持。

· 从MySQL5.5.5以后,InnoDB是默认引擎

· InnoDB不支持FULLTEXT类型的索引。

· InnoDB中不保存表的行数,如select count() from table时,InnoDB需要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count()语句包含where条件时MyISAM也需要扫描整个表。

· 对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引。

· DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的 删除,效率非常慢MyISAM则会重建表

· InnoDB支持行锁(某些情况下还是锁整表,如 update table set a=1 where user like '%lee%'。

3.2关于MySQL数据库提供的两种存储引擎,MyISAM与InnoDB选择使用:

· INNODB会支持一些关系数据库的高级功能如事务功能和行级锁,MyISAM不支持

· MyISAM的性能更优,占用的存储空间少,所以,选择何种存储引擎,视具体应用而定。

· 如果你的应用程序一定要使用事务,毫无疑问你要选择INNODB引擎。但要注意,INNODB的行级锁是有条件的。在where条件没有使用主键时,照样会锁全表。比如DELETE FROM mytable这样的删除语句。

· 如果你的应用程序对查询性能要求较高,就要使用MyISAM了MyISAM索引和数据是分开的,而且其索引是压缩的,可以更好地利用内存。所以它的查询性能明显优于INNODB。压缩后的索引也能节约一些磁盘空间。MyISAM拥有全文索引的功能,这可以极大地优化LIKE查询的效率

有人说MyISAM只能用于小型应用,其实这只是一种偏见。如果数据量比较大,这是需要通过升级架构来解决,比如分表分库,而不是单纯地依赖存储引擎。

现在一般都是选用innodb了,主要是MyISAM的全表锁,读写串行问题,并发效率锁表,效率低,MyISAM对于读写密集型应用一般是不会去选用的。

3.3 MEMORY存储引擎

MEMORY是MySQL中一类特殊的存储引擎。它使用存储在内存中的内容来创建表,而且数据全部放在内存中。这些特性与前面的两个很不同。

每个基于MEMORY存储引擎的表实际对应一个磁盘文件。该文件的文件名与表名相同,类型为frm类型。该文件中只存储表的结构。而其数据文件,都是存储在内存中,这样有利于数据的快速处理,提高整个表的效率。值得注意的是,服务器需要有足够的内存来维持MEMORY存储引擎的表的使用。如果不需要了,可以释放内存,甚至删除不需要的表。

MEMORY默认使用哈希索引。速度比使用B型树索引快。当然如果你想用B型树索引,可以在创建索引时指定。

注意,MEMORY用到的很少,因为它是把数据存到内存中,如果内存出现异常就会影响数据。如果重启或者关机,所有数据都会消失。因此,基于MEMORY的表的生命周期很短,一般是一次性的

  • (4)MySQL的MyISAM与InnoDB两种存储引擎在,事务、锁级别,各自的适用场景?

  • (5)查询语句不同元素(where、jion、limit、group by、having等等)执行先后顺序?

  • (6)什么是临时表,临时表什么时候删除?

临时表可以手动删除:

code_block="true">DROP TEMPORARY TABLE IF EXISTS temp_tb;

临时表只在当前连接可见,当关闭连接时,MySQL会自动删除表并释放所有空间。因此在不同的连接中可以创建同名的临时表,并且操作属于本连接的临时表

创建临时表的语法与创建表语法类似,不同之处是增加关键字TEMPORARY,如:

NAME VARCHAR (10) NOT NULL,
time date NOT NULL
);
select * from tmp_table;
  • (7)MySQL B+Tree索引和Hash索引的区别?
  • (8)sql查询语句确定创建哪种类型的索引?如何优化查询?
  • (9)聚集索引和非聚集索引区别?

答案解析:

聚合索引(clustered index) / 非聚合索引(nonclustered index)

根本区别

聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致

9.1聚集索引

聚集索引表记录的排列顺序和索引的排列顺序一致,所以查询效率快,只要找到第一个索引值记录,其余就连续性的记录在物理也一样连续存放。聚集索引对应的缺点就是修改慢,因为为了保证表中记录的物理和索引顺序一致,在记录插入的时候,会对数据页重新排序

聚集索引类似于新华字典中用拼音去查找汉字,拼音检索表于书记顺序都是按照a~z排列的,就像相同的逻辑顺序于物理顺序一样,当你需要查找a,ai两个读音的字,或是想一次寻找多个傻(sha)的同音字时,也许向后翻几页,或紧接着下一行就得到结果了。

9.2非聚集索引

非聚集索引制定了表中记录的逻辑顺序,但是记录的物理和索引不一定一致,两种索引都采用B+树结构,非聚集索引的叶子层并不和实际数据页相重叠,而采用叶子层包含一个指向表中的记录在数据页中的指针方式。非聚集索引层次多,不会造成数据重排

非聚集索引类似在新华字典上通过偏旁部首来查询汉字,检索表也许是按照横、竖、撇来排列的,但是由于正文中是a~z的拼音顺序,所以就类似于逻辑地址于物理地址的不对应。同时适用的情况就在于分组,大数目的不同值,频繁更新的列中,这些情况即不适合聚集索引。

  • (10)有哪些锁(乐观锁悲观锁),select 时怎么加排它锁?
  • (11)非关系型数据库和关系型数据库区别,优势比较?
  • (12)数据库三范式,根据某个场景设计数据表?
  • (13)数据库的读写分离、主从复制,主从复制分析的 7 个问题?
  • (14)使用explain优化sql和索引?
  • (15)MySQL慢查询怎么解决?

答案解析:

· slow_query_log 慢查询开启状态。

· slow_query_log_file 慢查询日志存放的位置(这个目录需要MySQL的运行帐号的可写权限,一般设置为MySQL的数据存放目录)。

· long_query_time 查询超过多少秒才记录。

  • (16)什么是 内连接、外连接、交叉连接、笛卡尔积等?
  • (17)mysql都有什么锁,死锁判定原理和具体场景,死锁怎么解决?
  • (18)varchar和char的使用场景?
  • (19)mysql 高并发环境解决方案?

答案解析:

MySQL 高并发环境解决方案 分库 分表 分布式 增加二级缓存。。。。。

需求分析:互联网单位 每天大量数据读取,写入,并发性高。

· 现有解决方式:水平分库分表,由单点分布到多点数据库中,从而降低单点数据库压力。

· 集群方案:解决DB宕机带来的单点DB不能访问问题。

· 读写分离策略:极大限度提高了应用中Read数据的速度和并发量。无法解决高写入压力。

  • (20)数据库崩溃时事务的恢复机制(REDO日志和UNDO日志)?

注意:由于篇幅原因,这里就不全部一一给出答案了,题目+答案解析都已整理成Word文档如下:

(Redis也整理成了相关的Word文档,需要这两份完整版答案的 “请移步评论区” !!!)

接下来就是Redis(20)

2.1 什么是Redis?怎么学习?

Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

Redis怎么学习?给大家分享一下Redis的学习路线大纲图(xmind):

2.2 Redis(20)高频必备题目与答案解析(记得先不要看答案哟~)

  • (1)为什么要用 redis /为什么要用缓存(高性能、高并发)

答案解析:

主要从“高性能”和“高并发”这两点来看待这个问题。

高性能

假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据存在数 缓

存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当 快。

如果数据库中的对应数据改变的之后,同步改变缓存中相应的数据即可!

高并发

直接操作缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中

去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。

image.png

  • (2)为什么要用 redis 而不用 map/guava 做缓存?
  • (3)redis 常见数据结构以及使用场景分析(String、Hash、List、Set、Sorted Set)
  • (4)Redis和memcached的区别?
  • (5)redis 内存淘汰机制(MySQL里有2000w数据,Redis中只存20w的数据,如何保证Redis中的数据都是热点数据?)
  • (6)redis 持久化机制(怎么保证 redis 挂掉之后再重启数据可以进行恢复)
  • (7)Redis设置过期时间?

答案解析:

Redis中有个设置时间过期的功能,即对存储在redis数据库中的值可以设置一个过期时间。作为一个缓存数据库,这

是非常实用的。如我们一般项目中的token或者一些登录信息,尤其是短信验证码都是有时间限制的,按照传统的数据库处理方式,一般都是自己判断过期,这样无疑会严重影响项目性能。

我们setkey的时候,都可以给一个expiretime,就是过期时间,通过过期时间我们可以指定这个key可以存活的时间。

如果假设你设置了一批key只能存活1个小时,那么接下来1小时后,期删除+惰性删除。

通过名字大概就能猜出这两个删除方式的意思了。

定期删除:redis默认是每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。

注意这里是随机抽取的。为什么要随机呢?你想一想假如redis存了几十万个key,每隔100ms就遍历所有的设置过期时间的key的话,就会给CPU带来很大的负载! 惰性删除:定期删除可能会导致很多过期key到了时间并没有被删除掉。所以就有了惰性删除。假如你的过期key,靠定期删除没有被删除掉,还停留在内存里,除非你的系统去查一下那个key,才会被redis给删除掉。这就是所谓的惰性删除,也是够懒的哈!

  • (8)Redis 常见异常及解决方案(缓存穿透、缓存雪崩、缓存预热、缓存降级)
  • (9)分布式环境下常见的应用场景(分布式锁、分布式自增 ID)
  • (10)Redis 集群模式(主从模式、哨兵模式、Cluster 集群模式)
  • (11)如何解决 Redis 的并发竞争 Key 问题?
  • (12)如何保证缓存与数据库双写时的数据一致性?

答案解析:

你只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致

性的问题,那么你如何解决一致性问题?

一般来说,就是如果你的系统不是严格要求缓存+数据库必须一致性的话,缓存可以稍微的跟数据库偶尔有不一致的情况,最好不要做这个方案,读请求和写请求串行化,串到一个内存队列里去,这样就可以保证一定不会出现不一致的情况串行化之后,就会导致系统的吞吐量会大幅度的降低,用比正常情况下多几倍的机器去支撑线上的一个请求。

  • (13)Redis 有哪几种数据淘汰策略?
  • (14)一个字符串类型的值能存储最大容量是多少?
  • (15)Redis集群方案应该怎么做?都有哪些方案?
  • (16)Redis集群方案什么情况下会导致整个集群不可用?

答案解析:

有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用。

  • (17)Redis 支持的 Java 客户端都有哪些?官方推荐用哪个?
  • (18)Redis 集群的主从复制模型是怎样的?
  • (19)Redis 中的管道有什么用?
  • (20)Redis 有哪些适合的场景?

答案解析:

(1)会话缓存(Session Cache)

最常用的一种使用 Redis 的情景是会话缓存(sessioncache),用 Redis 缓存会话比其他存储(如

Memcached)的优势在于:Redis 提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人都会不高兴的,现在,他们还会这样吗?

幸运的是,随着 Redis 这些年的改进,很容易找到怎么恰当的使用 Redis 来缓存会话的文档。甚至广为人知的商业平台 Magento 也提供 Redis 的插件。

(2)全页缓存(FPC)

除基本的会话 token 之外,Redis 还提供很简便的 FPC 平台。回到一致性问题,即使重启了 Redis 实

例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似 PHP 本地

FPC。再次以 Magento 为例,Magento 提供一个插件来使用 Redis 作为全页缓存后端。

此外,对 WordPress 的用户来说,Pantheon 有一个非常好的插件 wp-redis,这个插件能帮助你以最快速度加载你曾浏览过的页面。

(3)队列

Reids 在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得 Redis 能作为一个很好的消息队列平台来使用。Redis 作为队列使用的操作,就类似于本地程序语言(如 Python)对 list 的 push/pop

操作。

如果你快速的在 Google 中搜索“Redis queues”,你马上就能找到大量的开源项目,这些项目的目的

就是利用 Redis 创建非常好的后端工具,以满足各种队列需求。例如,Celery 有一个后台就是使用

Redis 作为 broker,你可以从这里去查看。

(4)排行榜/计数器Redis 在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(SortedSet)也使得我们在执行这些操作的时候变的非常简单,Redis 只是正好提供了这两种数据结构。

所以,我们要从排序集合中获取到排名最靠前的 10 个用户–我们称之为“user_scores”,我们只需要像

下面一样执行即可:

当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你需要这样执

行:ZRANGE user_scores 0 10 WITHSCORES

Agora Games 就是一个很好的例子,用 Ruby 实现的,它的排行榜就是使用 Redis 来存储数据的,你可以在这里看到。

(5)发布/订阅

最后(但肯定不是最不重要的)是 Redis 的发布/订阅功能。发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用 Redis 的发布/订阅功能来建立聊天系统!

篇幅原因,这里Redis也不一一列出答案,同MySQL一样已整理成Word文档

最后总结

今天小编要说的MySQL(20)与Redis(20)就是这些了,另外还有整理MySQL与Redis学习大全,如下所示,免费分享大家一起学习,祝春招顺利!!!

有需要这份大全资料的朋友注意啦:点击即可