mysql和redis面试准备(1)


1、主键索引和唯一索引有什么区别?
答:(1)主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。
(2)主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。
(3)唯一性索引列允许空值,而主键列不允许为空值。
(4)主键可以被其他表引用为外键,而唯一索引不能。
(5)一个表最多只能创建一个主键,但可以创建多个唯一索引。
(6)主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。
参考文档:https://www.cnblogs.com/-619569179/p/6528896.html

2、MySQL事务隔离级别有哪几种,默认是什么,分别解决了什么问题?
答:(1)默认级别是可重复读
(2)未提交读、提交读(解决了脏读问题)、可重复读(解决了脏读和不可重复读问题)、串行化读(解决了脏读和不可重复读、幻读问题)
(3)脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
参考文档:https://www.cnblogs.com/huanongying/p/7021555.html

3、聚簇索引和非聚簇索引的有什么不同?
答:(1)聚集索引的物理顺序和索引顺序一致,非聚集索引的物理顺序和索引顺序不一致
(2)先创建聚集索引,然后才能创建非聚集索引
(3)一个表只能有一个聚集索引,但是可以有多个非聚集索引
(4)在聚集索引中,数据存储在B+树的叶子节点上,而非聚集索引的叶子节点存放的是索引值而不是数据
(5)InnoDB是聚簇索引,MyISAM是非聚簇索引
参考文档:https://blog.csdn.net/chunlongyu/article/details/53360383

4、讲一下乐观锁和悲观锁,乐观锁是怎么保证一致性的?
答:(1)悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。再比如Java里面的同步原语synchronized关键字的实现也是悲观锁。
(2)乐观锁:顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。乐观锁通过版本号检查保证数据的一致性。
参考文档:http://wenkunet.com/p-45711.html

5、mysql索引失效的情况?(或者说哪些字段不适合建立索引)
答:索引失效会变成全表扫描,如联合索引的前缀匹配,跳跃索引,聚合函数,判空和<>这些情况。
where后面查询的条件:
(1)like模糊查询以%号开头
(2)使用or条件,但是or条件的左右两边,有一个没有使用索引,则索引失效
(3)索引查询条件使用了聚合函数,判断是否为空
(4)如果列类型为字符串,但是查询没有用引号引起来,则索引失效
(5)查询条件里面有!=号,或者小于大于号
(6)频繁进行更新的字段不适合建立索引
参考文档:https://blog.csdn.net/u014222774/article/details/54923483

6、如何创建索引?在哪些字段适合建立索引?
答:create index index_name on table.field
(1)经常查询的字段上
(2)where字句后面的字段、group by、order by、distinct
(3)主键字段、外键字段
(4)经常与其他表进行连接的表,在连接字段上应该建立索引

7、MyISAM与InnoDB事务引擎区别?应用场景分别是什么?为什么MyISAM会比Innodb的查询速度快?
答:(1)myisam支持表锁,innodb支持行锁;
(2)myisam查询效率高,innodb写入效率高;
(3)myisam不支持事务,innodb支持事务;
(4)myisam不支持外键,innodb支持外键;
(5)myisam支持全文索引,innodb不支持全文索引;
(6)MyISAM适合:(1)做很多count的计算;(2)插入不频繁,查询非常频繁;(3)没有事务。
InnoDB适合:(1)可靠性要求比较高,或者要求事务;(2)表更新和查询都相当的频繁,并且行锁定的机会比较大的情况。
(7)INNODB在做SELECT的时候,要维护的东西比MYISAM引擎多很多;INNODB要缓存数据块和索引块,MYISAM只缓存索引块, 这中间还有换进换出的减少; innodb寻址要映射到块,再到行,MYISAM 记录的直接是文件的OFFSET,定位比INNODB要快;INNODB还需要维护MVCC(Multi-Version Concurrency Control多版本并发控制 )一致;虽然你的场景没有,但他还是需要去检查和维护。
(8)myisam是非聚集索引,Innodb是聚集索引
参考文档:https://www.cnblogs.com/changna1314/p/6878900.html

8、如何理解最左前缀匹配原则?
答:(1)where语句之后查询的第一个字段要是建立索引的第一个字段
(2)最左前缀:顾名思义,就是最左优先,使用SQL语句(alter table table_name add index index_name(lname,fname,age) )创建了lname_fname_age多列索引,相当于创建了(lname)单列索引,(lname,fname)组合索引以及(lname,fname,age)组合索引。
(3)创建多列索引时,通常把第一列用在最频繁查询的字段上,这样执行效率会比较高
参考文档:https://www.cnblogs.com/jamesbd/p/4333901.html

9、SQL语句中count(1)和count(*)的区别?
答:(1)当要统计的数量比较大时,发现count(*)花费的时间比较多,相对来说count(1)花费的时间比较少。
(2)执行效率问题,因为使用count(*)的时候会对所有的列进行扫描,相比而言count(1)不用扫描所有列,所以count(1)要快一些。
参考文档:https://www.cnblogs.com/sueris/p/6650301.html

10、B树与B+树的区别?innoDB的B+树索引叶子节点的Data域存储的是什么?MyISAM的B+树索引叶子节点的Data域存储的是主键还是物理地址?
答:(1)B树:每个节点都存储key和data,所有节点组成这棵树,并且叶子节点指针为null。B+树:只有叶子节点存储data,叶子节点包含了这棵树的所有键值,叶子节点不存储指针
(2)innodb是聚集索引,myisam是非聚集索引。
(3)innodb的data域存的是数据本身,索引也是数据;myisam的data域存的是数据物理地址,索引是索引,数据是数据。
参考文档:https://blog.csdn.net/zhuanzhe117/article/details/78039692

11、mysql如何查询每个用户当天的用户订单量?
答:select datediff('2018-08-09','2015-08-10');
参考文档:https://www.cnblogs.com/nick-huang/p/4447717.html

12、说说redis的应用场景?
答:(1)计数器,利用key-value的数据类型
(2)队列,利用它的发布订阅模式
(3)缓存服务器,利用它的数据保存在内存中的优势
(4)排行榜,利用它的zset有序集合的数据类型
(5)最新新闻或数据显示,利用它的list数据类型,通过lpush最新的数据
(6)共同爱好,利用它的set集合数据类型
(7)redis能做分布式锁,这点也很关键的,主要是保证分布式系统中的数据一致性问题
参考文档:https://www.cnblogs.com/NiceCui/p/7794659.html

13、Redis的哨兵讲一下?
答:Sentinel(哨兵)进程是用于监控redis集群中Master主服务器工作的状态,在Master主服务器发生故障的时候,可以实现Master和Slave服务器的切换,保证系统的高可用,一般在生产环境也建议使用Redis的2.8版本的以后版本。哨兵(Sentinel) 是一个分布式系统,你可以在一个架构中运行多个哨兵(sentinel) 进程,这些进程使用流言协议(gossipprotocols)来接收关于Master主服务器是否下线的信息,并使用投票协议(Agreement Protocols)来决定是否执行自动故障迁移,以及选择哪个Slave作为新的Master。每个哨兵(Sentinel)进程会向其它哨兵(Sentinel)、Master、Slave定时发送消息,以确认对方是否”活”着,如果发现对方在指定配置时间(可配置的)内未得到回应,则暂时认为对方已掉线,也就是所谓的”主观认为宕机” 。当“哨兵群”中的多数Sentinel进程在对Master主服务器做出 SDOWN 的判断,并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后,得出的Master Server下线判断,这种方式就是“客观宕机”,通过一定的vote算法,从剩下的slave从服务器节点中,选一台提升为Master服务器节点,然后自动修改相关配置,并开启故障转移(failover)。
参考文档:https://www.cnblogs.com/PatrickLiu/p/8444546.html

14、给你一个表(数据很大),有用户名和数据,如何快速检索某条数据?
答:(1)对索引排序+二分查找。对索引建表,在新表里可以用hash、分区等操作。
(2)使用全文索引fullindex
(3)根据时间区段来进行查询,效率会高些
参考文档:https://www.nowcoder.com/discuss/95157?type=0&order=0&pos=9&page=1

15、redis数据类型有哪些?
答:Redis支持五种数据类型:Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
值可以是string(字符串,就是Key-Value类型的),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)
参考文档:http://www.runoob.com/redis/redis-data-types.html

 

此篇文章,还有20道题目,在我的面经中,详情看下面。

我会持续更新面试题目,包括linux,前端(vue,jquery,css)、python、mysql和redis的面经题目,后期加入golang。可以加我qq 2093905919或者微信 18828004657,跟我聊聊。(注:可以分享一部分面试题目,觉得可以的话,剩下的全部面试题目(多年经验,非常多而广的题目,适合突击面试复习,适合运维工程师,python工程师,运维开发,甚至前端开发(vue,asp,jquery)等等),需要打赏200元,绝对物超所值)

 

 

 

posted @ 2020-06-01 10:47  兮瓜公籽  阅读(388)  评论(0编辑  收藏  举报