数据库mysql和redis面试

 

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)非聚集索引需要查询2次,先找到索引数据,再去找物理数据。聚集索引只需要查询1次。
(3)一个表只能有一个聚集索引,但是可以有多个非聚集索引
(4)在聚集索引中,数据存储在B+树的叶子节点上,而非聚集索引的叶子节点存放的是索引值而不是数据
(5)InnoDB是聚簇索引,MyISAM是非聚簇索引
参考文档:https://blog.csdn.net/chunlongyu/article/details/53360383

4、讲一下乐观锁和悲观锁,乐观锁是怎么保证一致性的?
答:(1)悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。再比如Java里面的同步原语synchronized关键字的实现也是悲观锁。
(2)乐观锁:顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。乐观锁通过版本号检查保证数据的一致性。
1. 对于数据更新频繁的场合,悲观锁效率更高
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、查询每个用户当天的订单量。
select count(*) from tabA where time='2020-1-1' group by user


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)根据时间区段来进行查询,效率会高些


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

16、Redis主从复制的工作原理?
答:Redis主从同步策略:主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。
(1)从服务器读取配置文件来连接主服务器,发送SYNC命令; 
(2)主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用内存缓冲区记录此后执行的所有写命令; 
(3)主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令; 
(4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照; 
(5)主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令; 
(6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;
参考文档:https://www.cnblogs.com/kevingrace/p/5685332.html

17、Redis有哪些持久化方式?区别和应用场景是什么
答:(1)RDB快照持久化:在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,当子进程将快照写入临时文件完毕后,用临时文件替换原来的快照文件,然后子进程退出,用二进制压缩存储。
(2)AOF(append only file)将追加日志进行持久化:以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。
参考文档:https://www.cnblogs.com/AndyAo/p/8135980.html
(3)RDB优劣:第一,适合归档进行备份,因为只有单文件;第二,故障停机的时候可能会丢失数据,因为写入磁盘的时间可能耗时较长
(4)AOF优劣:重放最近的命令
(5)RDB 恢复数据集的速度也要比 AOF 恢复的速度要快,因为AOF文件通常比RDB大、虽然RDB快照备份慢
(6)可以同时开启RDB和AOF备份方式

18、修改配置不重启Redis会实时生效吗?查看redis内存使用状况和主从复制状态使用什么命令?redis如何设置过期时间和永久有效呢?
答:(1)可以通过客户端连接过去配置,敲入config命令,就不需要重启redis,但要想永久生效的话,还是需要修改配置文件,当然修改配置文件就需要重启redis服务了。
(2)使用redis-cli连接过去,然后使用info命令查看
(3)set key value EX [秒]  或者 set key value PX [毫秒],如果不加时间,直接set key value的话,永不过期,并且开始持久化
参考文档:https://segmentfault.com/q/1010000010372534

19、mysql和redis如何保证一致性?
答:(1)redis只作为读缓存,如果有对应key,则返回,没有key,则从数据库取值
(2)客户端写入数据的时候,先写入MySQL,而后删除redis的缓存key
(3)并且设置Key的过期时间,例如30分钟。极限场景下,即使有脏数据入cache,这个脏数据也最多存在三十分钟。
参考文档:https://www.nowcoder.com/discuss/92611

20、如何判断SQL语句的执行性能?如何进行调优,有哪些着重点?
答:explain命令,如explain select * from news;
(1)建立适当的索引,如联合索引
(2)避免子查询,尽量使用多表查询
(3)分库分表,避免全表扫描
(4)避免在索引中使用函数
(5)limit分页查询,或者between在某个时间段查询

 

posted @ 2021-01-30 20:16  兮瓜公籽  阅读(198)  评论(0编辑  收藏  举报