第三部分 数据库和缓存(46题)

备注:自用回答

1、列举常见的关系型数据库和非关系型都有那些?

答:http://www.cnblogs.com/zylq-blog/p/7595979.html

关系型数据库:mysql,oracle,sqlserver,sqlite

关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织

优点:

(1)易于维护:都是使用表结构,格式一致;

(2)使用方便:SQL语言通用,可用于复杂查询;

(3)复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。

缺点:

(1)读写性能比较差,尤其是海量数据的高效率读写;

(2)固定的表结构,灵活度稍欠;

(3)高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。

非关系型数据库:mongoDB,redis

非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等。

优点:

(1)格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。

(2)速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;

(3)高扩展性;

(4)成本低:nosql数据库部署简单,基本都是开源软件。

缺点:

(1)不提供sql支持,学习和使用成本较高;

(2)无事务处理;

(3)数据结构相对复杂,复杂查询方面稍欠。

非关系型数据库的分类和比较:

(1)文档型,如mongoDB

(2)key-value型,如redis

(3)列式数据库

(4)图形数据库

2、MySQL常见数据库引擎及比较?

答:InnoDB:支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。 

MyISAM:插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比较低,也可以使用。

MEMORY:所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。

注意,同一个数据库也可以使用多种存储引擎的表。如果一个表要求比较高的事务处理,可以选择InnoDB。这个数据库中可以将查询要求比较高的表选择MyISAM存储。如果该数据库需要一个用于查询的临时表,可以选择MEMORY存储引擎。

3、简述数据三大范式?

答:什么是三大范式:

第一范式:当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式规范化的最低要

求,否则,将有很多基本操作在这样的关系模式中实现不了。

第二范式:如果关系模式R满足第一范式,并且R得所有非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式,简记为2NF。

第三范式:设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,简记为3NF.

注:关系实质上是一张二维表,其中每一行是一个元组,每一列是一个属性

4、什么是事务?MySQL如何支持事务?

答:原子性、一致性、隔离性、持久性

在mysql中用的最多的存储引擎有:innodb,bdb,myisam ,memory 等。其中innodb和bdb支持事务而myisam等不支持事务。

5、简述数据库设计中一对多和多对多的应用场景?

答:一对多关系示例:一个学生只属于一个班,但是一个班级有多名学生。

       多对多关系示例:一个学生可以选择多门课,一门课也有多名学生。

6、如何基于数据库实现商城商品计数器?

答:如果是在非常高的并发之下,还是建议用内存数据库redis去实现计数的功能。如果不是那么高的并发,用表实现就可以。

https://blog.csdn.net/stevendbaguo/article/details/70889449

7、常见SQL(必备)

详见武沛齐博客:https://www.cnblogs.com/wupeiqi/articles/5729934.html

8、简述触发器、函数、视图、存储过程?

答:https://blog.csdn.net/running_nz/article/details/51111927

9、MySQL索引种类

答:1.普通索引2.唯一索引3.主键索引4.组合索引5.全文索引

10、索引在什么情况下遵循最左前缀的规则?

答:最左前缀原理的一部分,索引index1:(a,b,c),只会走a、a,b、a,b,c 三种类型的查询,其实这里说的有一点问题,a,c也走,但是只走a字段索引,不会走c字段。

索引是有序的,index1索引在索引文件中的排列是有序的,首先根据a来排序,然后才是根据b来排序,最后是根据c来排序,

11、主键和外键的区别?

答:主键:唯一标识一条记录,不能有重复的,不允许为空

外键:表的外键是另一表的主键, 外键可以有重复的, 可以是空值

12、MySQL常见的函数?

答:sum,abs,floor

13、列举 创建索引但是无法命中索引的8种情况。

答:https://blog.csdn.net/zengdeqing2012/article/details/38532217

       (1)如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)

  要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引

  (2)对于多列索引,不是使用的第一部分,则不会使用索引

  (3)like查询以%开头

  (4)如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引

  (5)如果mysql估计使用全表扫描要比使用索引快,则不使用索引

14、如何开启慢日志查询?

答:https://www.jb51.net/article/115372.htm

slow_query_log =1

slow_query_log_file=/application/mysql/data/localhost-slow.log

long_query_time = 1

15、数据库导入导出命令(结构+数据)?

答:https://www.cnblogs.com/doudouxiaoye/p/5819607.html

16、数据库优化方案?

答:https://blog.csdn.net/q602075961/article/details/71076390

17、char和varchar的区别?

答:char不可变字段,varchar是可变字段

https://blog.csdn.net/qq_34858648/article/details/77881176

18、简述MySQL的执行计划?

答:https://blog.csdn.net/heng_yan/article/details/78324176

MySql提供了EXPLAIN语法用来进行查询分析,在SQL语句前加一个"EXPLAIN"即可

19、在对name做了唯一索引前提下,简述以下区别:

答:过滤出数据的同时,进行计数

20、1000w条数据,使用limit offset 分页时,为什么越往后翻越慢?如何解决?

答: 先查主键,在分页。 select * from tb where id in(select id from tb where limit 10 offset 20)

21、什么是索引合并?

答:索引合并,让一条sql可以使用多个索引。对这些索引取交集,并集,或者先取交集再取并集。从而减少从数据表中取数据的次数,提高查询效率。

22、什么是覆盖索引?

答:如果一个索引包含(或覆盖)所有需要查询的字段的值,称为‘覆盖索引’

23、简述数据库读写分离?

答:主服务器master记录数据库操作日志到Binary log,从服务器开启i/o线程将二进制日志记录的操作同步到relay log(存在从服务器的缓存中),另外sql线程将relay log日志记录的操作在从服务器执行。 

24、简述数据库分库分表?(水平、垂直)

答:(1)数据库分表

    把一张表按照一定的规则分解成不同的实体表。比如垂直划分和水平划分

  垂直切分:把不同功能,不同模块的数据分别放到不同的表中,但是如果同一个模块的数据量太大就会存在性能瓶颈

水平切分:垂直切分解决不了大表的瓶颈,如果同一个功能中表的数据量过大,就要对该表进行切分,为水平切分

通俗理解:垂直切分---分不同的模块表;水平切分---分同一个模块下的多个表

(2)分库

将一堆数据放到不同的数据库中保存,上面说的都是在同一个数据库上,分库是分到不同的数据库上

25、redis和memcached比较?

答:(1) Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。

(2)Redis支持数据的备份,即master-slave模式的数据备份。

(3)Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。

26、redis中数据库默认是多少个db 及作用?

答:当redis 服务器初始化时,会预先分配 16 个数据库(该数量可以通过配置文件配置),所有数据库保存到结构 redisServer 的一个成员 redisServer.db 数组中。当我们选择数据库 select number 时,程序直接通过 redisServer.db[number] 来切换数据库。有时候当程序需要知道自己是在哪个数据库时,直接读取 redisDb.id 即可。

27、python操作redis的模块?

答:https://www.cnblogs.com/xtsec/p/7000404.html

导入redis,链接redis数据库,对redis api的使用

28、如果redis中的某个列表中的数据量非常大,如果实现循环显示每一个值?

答:可以尝试将对象分拆成几个key-value, 使用multiGet获取值,这样分拆的意义在于分拆单次操作的压力,将操作压力平摊到多个redis实例中,降低对单个redis的IO影响;    

29、redis如何实现主从复制?以及数据同步机制?

答:Redis的主从同步机制可以确保redis的master和slave之间的数据同步

全备份过程中,在slave启动时,会向其master发送一条SYNC消息,master收到slave的这条消息之后,将可能启动后台进程进行备份,备份完成之后就将备份的数据发送给slave

30、redis中的sentinel的作用?

答:用于监控redis集群中Master状态的工具

31、如何实现redis集群?

答:Redis集群设计包括2部分:哈希Slot和节点主从

主从模式的设计:

优点:读写分离,通过增加Slaver可以提高并发读的能力。

缺点:Master写能力是瓶颈。

         虽然理论上对Slaver没有限制但是维护Slaver开销总将会变成瓶颈。

         Master的Disk大小也将会成为整个Redis集群存储容量的瓶颈。

哈希Slot的优缺点:

缺点:每个Node承担着互相监听、高并发数据写入、高并发数据读出,工作任务繁重

优点:将Redis的写操作分摊到了多个节点上,提高写的并发能力,扩容简单。

32、redis中默认有多少个哈希槽?

答:16384 个哈希槽

33、简述redis的有哪几种持久化策略及比较?

答:rdb:快照形式是直接把内存中的数据保存到一个dump文件中,定时保存,保存策略

        aof:把所有的对redis的服务器进行修改的命令都存到一个文件里,命令的集合

34、列举redis支持的过期策略。

答:volatile-lru:只对设置了过期时间的key进行LRU(默认值) 

allkeys-lru : 删除lru算法的key   

volatile-random:随机删除即将过期key   

allkeys-random:随机删除   

volatile-ttl : 删除即将过期的   

noeviction : 永不过期,返回错误  

35、MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中都是热点数据? 

答:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。redis 提供 6种数据淘汰策略: 

volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

no-enviction(驱逐):禁止驱逐数据

36、写代码,基于redis的列表实现 先进先出、后进先出队列、优先级队列。

答:请求的优先级。我们先假设一个最简单的场景,有三个优先级:高中低三级。可以设置3个list结构,比如叫queue_h,queue_m,queue_l,分别对应三个优先级。

37、如何基于redis实现消息队列?

答:使用lpush向list的左端推送数据(发送消息),使用rpop从右端接收数据(消费消息)

38、如何基于redis实现发布和订阅?以及发布订阅和消息队列的区别?

答:“发布/订阅”模式包含两种角色,分别是发布者和订阅者。订阅者可以订阅一个或若干个频道(channel),而发布者可以向指定的频道发送消息,所有订阅此频道的订阅者都会收到此消息。

39、什么是codis及作用?

答:Codis是一个分布式的Redis解决方案,对于上层的应用来说,连接Codis Proxy和连接原生的Redis Server没有明显的区别,上层应用可以像使用单机的Redis一样使用,Codis底层会处理请求的转发,不停机的数据迁移等工作,所有后边的一切事情,对于前面客户端来说是透明的,可以简单的认为后边连接是一个内存无限大的Redis服务。

业务需要,数据可能需要迁移,机器横向扩容

经过线上测试,Codis的升级版Reborn在pipline操作的性能比Codis慢了几十倍

40、什么是twemproxy及作用?

答:twemproxy是 Twtter 开源的一个 Redis 和 Memcache 代理服务器,主要用于管理 Redis 和 Memcached 集群,减少与Cache 服务器直接连接的数量。

41、写代码实现redis事务操作。

答:Redis会将一个事务中的所有命令序列化,然后按顺序执行

42、redis中的watch的命令的作用?

答:当某个事务需要按条件执行时,就要使用这个命令将给定的键设置为受监控的

43、基于redis如何实现商城商品数量计数器?

答:https://www.cnblogs.com/JockChou/p/4647973.html

44、简述redis分布式锁和redlock的实现机制。

45、什么是一致性哈希?Python中是否有相应模块?

46、如何高效的找到redis中所有以oldboy开头的key?

你可能感兴趣的:(第三部分 数据库和缓存(46题))