【2018】Python面试题【数据库】

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

关系型:Mysql / Oracle / SQL Server
非关系型:redis / MongoDB…

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

MySQL数据库中的表引擎一般常用两种:MyISAM和InnoDB
区别:
MyISAM类型的数据文件有三个1.frm(结构)、2.MYD(数据)、3.MYI(索引)
MyISAM类型中的表数据增 删 改速度快,不支持事务,没有InnoDB安全。
InnoDB类型的数据文件只有一个 .frm
InnoDB类型的表数据增 删 改速度没有MyISAM的快,但支持事务,相对安全。

3、简述数据三大范式?

1, 每一列只有一个值
2, 每一行都能区分。
3, 每一个表都不包含其他表已经包含的非主关键字信息。

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

同时对一组数据进行操作的语句就成为事务
在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。

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

一对多 :一个学生对多门考试成绩
多对多 :一个老师教多个学生 一个学生让好几个老师教

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

设置一个商品计数的列 自动递增为1

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

触发器:制定一个sql条件和要做的事当满足的时候自动触发并执行要做的事
函数(存储过程):Mysql储存过程简而言之就是一组已经好的命令,需要使用的时候拿出来用就可以
视图:将一个写好的查询语句封装起来 当调用的时看到的数据就是满足条件的数据 不用每次都写同样的代码

9、MySQL索引种类

  • 唯一索引
  • 主键索引
  • 普通索引
  • 全文索引

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

联合索引

11、主键和外键的区别?

这里写图片描述

12、MySQL常见的函数?

*concat(s1,s2,…Sn) 连接s1,s2..Sn为一个字符串
*length(str) 返回值为字符串str 的长度
*datediff(expr,expr2) 返回起始时间和结束时间的间隔天数

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

1、如果条件中有or,即使其中有条件带索引也不会使用
2、对于多列索引,不是使用的第一部分(第一个),则不会使用索引
3、like查询是以%开头
4、如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引5、如果mysql估计使用全表扫描要比使用索引快,则不使用索引

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

1.查看慢查询是否开启
show variables like ‘slow_query%’;
show variables like ‘long_query_time’;

2.打开慢查询
set global slow_query_log=’ON’;

3.设置慢查询日志记录文件
set global slow_query_log_file=’/var/lib/mysql/test-10-226-slow.log’;

4.指定慢查询事件
set global long_query_time=1;

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

导出:
mysqldump -u root -p 库名 >导出的文件.sql

导入:
mysql -u root -p 库名

16、数据库优化方案?

为经常查询的字段添加索引
减少外键关联查询

17、char和varchar的区别?

char的长度是不可变的,而varchar的长度是可变的,也就是说,定义一个char[10]和varchar[10],如果存进去的是‘csdn’,那么char所占的长度依然为10,除了字符‘csdn’外,后面跟六个空格,而varchar就立马把长度变为4了

18、简述MySQL的执行计划?

数据库的执行计划通俗点说就是,数据库服务器在执行sql语句的时候,会准备几套方案,最后选择消耗资源最小的那个方案。就是执行计划。

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

select* from tb where name= ‘Oldboy-Wupeiqi’ —–取出所有name= Oldboy-Wupeiqi
select* from tb where name= ‘Oldboy-Wupeiqi’ limit1 —–只取出第一条 name=Oldboy-Wupeiqi

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

当一个数据库表过于庞大,LIMIT offset, length中的offset值过大,则SQL查询语句会非常缓慢,增加order by,并且order by字段需要建立索引。

21、什么是索引合并?

1、索引合并是把几个索引的范围扫描合并成一个索引。
2、索引合并的时候,会对索引进行并集,交集或者先交集再并集操作,以便合并成一个索引。
3、这些需要合并的索引只能是一个表的。不能对多表进行索引合并。

22、什么是覆盖索引?

就是select的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖。

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

对于数据存储层高并发问题,最先想到的可能就是读写分离,在网站访问量大并且读写不平均的情况下,将存储分为master,slave两台,所有的写都路由到master上,所有的读都路由到slave上,然后master和slave同步。如果一台salve不够,可以加多台,比如一台master,3台slave。

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

分区的主要目的是将数据按照一个较粗的粒度分在不同的表中,这样可以将相关的数据存放在一起,而且如果想一次性的删除整个分区的数据也很方便。
通过一些HASH算法或者工具实现将一张数据表垂直或者水平进行物理切分

25、redis和memcached比较?

1、Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存其他东西,例如图片、视频等等;

2、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储;

3、虚拟内存–Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘;

4、过期策略–memcache在set时就指定,例如set key1 0 0 8,即永不过期。Redis可以通过例如expire 设定,例如expire name 10;

5、分布式–设定memcache集群,利用magent做一主多从;redis可以做一主多从。都可以一主一从;

6、存储数据安全–memcache挂掉后,数据没了;redis可以定期保存到磁盘(持久化);

7、灾难恢复–memcache挂掉后,数据不可恢复; redis数据丢失后可以通过aof恢复;

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

redis默认有十六个db

27、python操作redis的模块?

import redis
r = redis.Redis(host='127.0.0.1', port=6379,decode_responses=True)
r.set('name', 'OK')
print(r.get('name'))

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

查询取出列表的值让后使用python循环

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

在Master和Slave互通之后,首先,Slave会发送sync同步指令,当Master收到指令后,将在后台启动存盘进程,同时收集所有来自Slave的修改数据集的指令信息,当后台进程完成之后,Master将发送对应的数据库文件到对应的Slave中,以完成一次完整的同步工作。其次Slave在接受到数据库文件之后,将其存盘并加载到内存中。最后,Master继续收集修改命令和新增的修改指令,并依次发送给Slave,其将在本次执行这些数据的修改命令,从而最终达到数据同步的实现。

30、redis中的sentinel的作用?

Redis Sentinel 为Redis提供了高可用的实现。通俗来说就是你可以部署一套无需人为干预即可防灾的Redis环境。
RS同时为客户端提供了其他诸如监控,通知的功能。

31、如何实现redis集群?

官方cluster方案
twemproxy代理方案
哨兵模式
codis
客户端分片

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

有2**14个哈希槽 16384个

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

rdb:快照形式是直接把内存中的数据保存到一个dump文件中,定时保存,保存策略
aof:把所有的对redis的服务器进行修改的命令都存到一个文件里,命令的集合

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

定时删除
含义:在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除

惰性删除
含义:key过期的时候不删除,每次从数据库获取key的时候去检查是否过期,若过期,则删除,返回null。

定期删除
含义:每隔一段时间执行一次删除(在redis.conf配置文件设置hz,1s刷新的频率)过期key操作

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

LRU(最近少用的淘汰)

即redis的缓存每命中一次,就给命中的缓存增加一定ttl(过期时间)(根据具体情况来设定, 比如10分钟).一段时间后, 热数据的ttl都会较大, 不会自动失效, 而冷数据基本上过了设定的ttl就马上失效了.

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

先进lpush keys values 先出 rpop keys

先进lpush keys values 后出 lpop keys

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

Redis中五大数据结构之一—列表,其PUSH和POP命令遵循FIFO先进先出原则。当我们需要发布消息的时候执行LPUSH(消息从左边进入队列),消息接收端执行RPOP获得消息(消息从右侧弹出)。对于列表,Redis提供了带有阻塞的命令(命令前加B)。因此,生产者lpush消息,消费者brpop(从列表中弹出最右端元素,如无元素则一直阻塞到timeout)消息,并设定超时时间timeout,可以减少redis的压力。

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

创建一个频道 客户端加入频道 等待频道发布订阅

39、什么是codis及作用?

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

40、什么是twemproxy及作用?

Twemproxy是一种代理分片机制,由Twitter开源。Twemproxy作为代理,可接受来自多个程序的访问,按照路由规则,转发给后台的各个Redis服务器,再原路返回。该方案很好的解决了单个Redis实例承载能力的问题。

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

>multi   //开启一个事务
>set age 10 //暂存指令队列
>set age 20
>exec    //开始执行(提交事务)
或>discard //清空指令队列(事务回滚)

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

Redis Watch 命令用于监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断

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

指定键的值做加加操作,返回加后的结果。

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

在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段。
一个Client想要获得一个锁需要以下几个操作:

得到本地时间Client使用相同的key和随机数,按照顺序在每个Master实例中尝试获得锁。在获得锁的过程中,为每一个锁操作设置一个快速失败时间(如果想要获得一个10秒的锁, 那么每一个锁操作的失败时间设为5-50ms)。
这样可以避免客户端与一个已经故障的Master通信占用太长时间,通过快速失败的方式尽快的与集群中的其他节点完成锁操作。

客户端计算出与master获得锁操作过程中消耗的时间,当且仅当Client获得锁消耗的时间小于锁的存活时间,并且在一半以上的master节点中获得锁。才认为client成功的获得了锁。

如果已经获得了锁,Client执行任务的时间窗口是锁的存活时间减去获得锁消耗的时间。
如果Client获得锁的数量不足一半以上,或获得锁的时间超时,那么认为获得锁失败。客户端需要尝试在所有的master节点中释放锁, 即使在第二步中没有成功获得该Master节点中的锁,仍要进行释放操作。

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

对节点和数据,都做一次哈希运算,然后比较节点和数据的哈希值,数据取和节点最相近的节点做为存放节点。这样就保证当节点增加或者减少的时候,影响的数据最少。
hash_ring 是python中做一致性哈希的模块

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

key oldboy*

猜你喜欢

转载自blog.csdn.net/qq_37275405/article/details/81226213