1.mysql部分

问题

问题1:mysql的存储引擎

问题2:mysql的索引机制

问题3:mysql的事务以及事务隔离级别

问题4:mvcc/GAP lock是做什么的

问题5:mysql的悲观锁与乐观锁

回答

问题1:mysql的存储引擎

mysql的存储引擎

  • 在mysql中的查询语句为:mysql> show engines,
  • 查看当前mysql的默认存储引擎为:mysql> show variables like '%storage_engine%',
  • 查看某个表用了什么引擎则是:mysql> show create table 表名;

mysql的常用存储引擎

  • MyISAM:不支持事务,不支持外键,访问速度快,对事务完整性没有要求,设计之初主要为了查询操作。使用场景有:非事务型应用,只读类应用,空间类应用
  • InnoDB(MySQL 5.5后默认引擎):支持完整事务,支持外键约束,行级锁,设计之初处理大容量数据库操作,容易有IO瓶颈。使用场景:适用绝大多数场景
  • MEMORY:只存储表,数据放在内存中,掉电后数据不保留,访问速度快。使用场景:内容变化不频繁的代码表,或者是作为统计

问题2:mysql的索引机制

mysql的索引机制有如下几种

  • 聚集索引:就是按照每张表的主键构造一颗B+树,叶子节点村完整的行记录数据,未定义主键,则取第一个唯一索引,每张表只能拥有一个聚集索引。在多数情况下,查询优化器倾向于采用聚集索引。因为聚集索引能够在B+树索引的叶子节点上直接找到数据,并且可以快速查找数据。
  • 非聚集索引:是对聚集索引的一种补充,每张表可以有多个辅助索引,辅助索引与聚集索引区别为叶子节点不包含行记录的全部数据,除此之外还包含一个书签,可以指向对应的行数据。
  • 普通索引:普通的索引,index只是为了加速查找
  • 唯一索引:主键索引:加速查找+约束(不为空,不能重复) 唯一索引:加速查找+约束(不能重复)
  • 组合索引:多个索引联合查找,查找顺序从左到右查询。

备注:举例说明索引机制的使用场景(商城的会员卡系统,会员编号作为主键,会员编号就是唯一索引,用来创建B+树;会员姓名如果要创建索引,则就是普通索引;会员身份证信息如果要创建索引,则就是唯一索引)

补充知识:B+树与B树

(1.)B树

所谓的B树就是多路搜索树,任意一个非叶子节点最多有M个儿子,关键字分布在整颗树中,任何一个关键字出现且只出现一个节点中,搜索有可能在非叶子节点中结束,性能等价于二分查找,时间复杂度为O(lgN)

如:(M=3)

(2.)B+树

所谓的B+树,就是B树的变体,也是多路搜索树,非叶子节点的字数指针与关键字个数相同,非叶子节点子树指针指向子树,所有的叶子节点都增加一个链指针,所有的关键字都在叶子节点中出现,不可能在非叶子结点命中,非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层,比较适合文件索引系统

如:(M=3)


问题3:mysql的事务以及事务隔离级别

mysql的事务遵循4个条件(ACID),有原子性:不可分割性;一致性;隔离性;持久性;在实际使用中,使用事务保证一个事务中的操作,要么全部完成,要么全部不完成,保证数据的安全性

其中事务隔离级别分为以下几种

  • RU:既未提交读,容易出现脏读情况,既事务A读到了事务B没有提交的数据;
  • RC:既提交读,为解决脏读问题,容易出现提交重复的情况,既事务A在执行的过程中,有可能事务B提交了数据,事务读取的数据和之前不一致;
  • RR:既可重复读,为解决上一级的数据不一致问题,该级别采用MVCC(多版本并发操作)解决重复读,一般RR级别会产生幻读的问题,既同一个事务多次执行同一个select,读取到的数据行发生了改变,这是因为数据行发生了行数减少或者新增;所谓幻读就是同一个事务里,查询的结果都是事务开始时的状态(一致性)。但是,如果另一个事务同时提交了新数据,本事务再更新时,就会“惊奇的”发现了这些新数据,貌似之前读到的数据是“鬼影”一样的幻觉。搞笑的比喻就是,假如,中午去食堂打饭吃,看到一个座位是空的,便屁颠屁颠的去打饭,回来后,发现这些座位都还是空的(重复读),窃喜。走到跟前刚准备坐下时,却惊现一个恐龙妹,严重影响食欲。仿佛之前看到的空座位是“幻影”一样。但是mySQL中RR级别引入了GAP LOCK(间隙锁)的概念,可在RR级别即可解决幻读的问题;另外一个特性是mysql里的MVCC只解决读-写的阻塞问题,写-写依然还是阻塞的。
  • SE:既可序列化,事务相当于串行操作,解决了脏读、不可重复读、幻读等问题,但对性能和效率的影响很大

问题4:mvcc/GAP lock是做什么的

MVCC:既多版本并发操作,基本原理就是某个时间点的快照,每行数据都存在一个版本,每次数据更新时都更新该版本,修改是copy出当前版本随意修改,各个事务之间无干扰,保存时则比较版本号,如果成功,则覆盖原纪录,失败则放弃并回滚。需要注意的是mysql里的MVCC只解决读-写的阻塞问题,写-写依然还是阻塞的

GAP lock:间隙锁,用于解决mySQL中RR级别的幻读问题,如果一个事务操作的是一个区间的数据,会锁住这个区间所有的记录,即使这个记录不存在,这个时候另一个会话去插入这个区间的数据,就必须等待上一个结束。需要注意的是在此有可能会产生GAP死锁,例如下图

问题5:mysql的悲观锁与乐观锁

无论悲观锁和乐观锁都是并发控制主要采用的技术手段,都是为了保证数据库中的数据的完整性与一致性

悲观锁:对数据被外界修改持保守态度 (悲观),因此,在整个数据处理过程中,将数据处于锁定状态。 悲观锁的实现,往往依靠数据库提供的锁机制,而悲观锁一般流程如下

  1. 在对任意记录进行修改前,先尝试为该记录加上排他锁(exclusive locking)
  2. 如果加锁失败,说明该记录正在被修改,那么当前查询可能要等待或者抛出异常。 具体响应方式由开发者根据实际需要决定。
  3. 如果成功加锁,那么就可以对记录做修改,事务完成后就会解锁了。

悲观锁主要用于数据争用激烈的环境,以及发生并发冲突时使用锁保护数据的成本要低于回滚事务的成本的环境中。在效率方面,处理加锁的机制会让数据库产生额外的开销,还有增加产生死锁的机会;另外,在只读型事务处理中由于不会产生冲突,也没必要使用锁,这样做只能增加系统负载,还有会降低了并行性。

悲观锁的应用

乐观锁:假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。在对数据库进行处理的时候,乐观锁并不会使用数据库提供的锁机制。一般的实现乐观锁的方式就是记录数据版本。

  1. 当读取数据时,将版本标识的值一同读出,数据每更新一次,同时对版本标识进行更新。
  2. 当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的版本标识进行比对
  3. 如果数据库表当前版本号与第一次取出来的版本标识值相等,则予以更新,否则认为是过期数据。

乐观锁的应用

2.MongoDB部分

问题:

问题1:MongoDB的存储引擎以及底层存储机制

问题2:MongoDB的版本变迁既特性

回答:

问题1:

存储引擎如下:

  • MMAP:
  • WiredTiger:3.2版本默认存储引擎都改为了wiredtiger,特性为:文档级别锁,解决了锁粒度过大的问题,磁盘数据压缩,删除数据时,数据会立即删除,MongoDB3.0在多线程、批量插入场景下较之于MongoDB2.6有大约4-7倍的增长
  • RocksDB:特性:顺序写入:LSM Tree结构,随机写入转换为顺序写入;速度稳定:和WiredTiger相比,写速度稳定
  • Memory

底层存储机制:空间局部性原理,B树

问题2:

MongoDB 3.0特性(2015年):顺序写入:LSM Tree结构,随机写入转换为顺序写入,速度稳定:和WiredTiger相比,写速度稳定

MongoDB 4.0特性(2018年6月):多文档事务支持,4.2版本开始支持分片集群分布式事务

3.Redis部分

问题:

问题1:redis支持的数据类型常用使用场景

问题2:redis的存储机制以及常用集群

回答

问题1:

redis支持的数据类型主要有string,list,set,zset,hash

redis的常用使用场景

  • 作为热数据的缓存数据库,缓存高频次访问的数据,降低数据库的IO
  • 分布式架构,做session共享
  • 利用zset类型可以做存储排行榜
  • 利用list做简易MQ或存储最新的n个数据

问题2:

redis的存储机制有

  • list键:双向链表
  • hash键:字典dict
  • zset键:跳跃表zskiplist
  • ziplist:节省内存空间

常用集群方式有

  • Twitter开发的twemproxy
  • 豌豆荚开发的codis
  • redis官方的redis-cluster

ok

python_面试题_DB相关问题的更多相关文章

  1. 剑指offer编程题Java实现——面试题12相关题大数的加法、减法、乘法问题的实现

    用字符串或者数组表示大数是一种很简单有效的表示方式.在打印1到最大的n为数的问题上采用的是使用数组表示大数的方式.在相关题实现任意两个整数的加法.减法.乘法的实现中,采用字符串对大数进行表示,不过在具 ...

  2. 剑指offer编程题Java实现——面试题7相关题用两个队列实现一个栈

    剑指offer面试题7相关题目:用两个队列实现一个栈 解题思路:根据栈的先入后出和队列的先入先出的特点1.在push的时候,把元素向非空的队列内添加2.在pop的时候,把不为空的队列中的size()- ...

  3. python_面试题_HTTP基础相关问题

    1.相关问题 问题1: 客户端访问url到服务器,整个过程会经历哪些 问题2: 描述HTTPS和HTTP的区别 问题3: HTTP协议的请求报文和响应报文格式 问题4: HTTP的状态码有哪些? 2. ...

  4. 京东面试题 Java相关

    1.JVM的内存结构和管理机制: JVM实例:一个独立运行的java程序,是进程级别 JVM执行引擎:用户运行程序的线程,是JVM实例的一部分 JVM实例的诞生 当启动一个java程序时.一个JVM实 ...

  5. python_面试题_TCP的三次握手与四次挥手问题

    1.相关问题 问题1: 请详细描述三次握手和四次挥手的过程,并画出状态图 问题2: 四次挥手中TIME_WAIT状态存在的目的是什么? 问题3: TCP是通过什么机制保障可靠性的? 2.问题回答 问题 ...

  6. Python_面试题_更新中

    Python-面试题 线上操作系统 centos py2和py3的区别 每种数据类型,列举你了解的方法 3 or 9 and 8 字符串的反转 is 和 == 的区别? git流程 v = (1) / ...

  7. python面试题-python相关

    1. __new__.__init__区别,如何实现单例模式,有什么优点 __new__是一个静态方法,__init__是一个实例方法 __new__返回一个创建的实例,__init__什么都不返回 ...

  8. Python面试题-数据库相关

    1.mysql如何做分页 mysql数据库做分页用limit关键字,它后面跟两个参数startIndex和pageSize 2.mysql引擎有哪些 innodb和myisam两个引擎,两者区别是 i ...

  9. js 面试题正则相关

    正则相关[i不区分大小写,g匹配全部数据] var str = "Hello word! I think word is good."; 1.替换str中的word为javascr ...

随机推荐

  1. poj1015 Jury Compromise[背包]

    每一件物品有两个属性.朴素思想是把这两种属性都设计到状态里,但空间爆炸.又因为这两个属性相互间存在制约关系(差的绝对值最小),不妨把答案设计入状态中,设$f[i][j]$选$i$个人,两者之差$j$. ...

  2. 一个原生ajax在jetbrains开发平台的调用方法

    这段随笔的记述目的无非是,一个html页面中可能有多段js代码,所以采用外引的方法应该会好一些 function checkfiles() { var xhr = new XMLHttpRequest ...

  3. Python语法之垃圾回收机制

    目录 一 引入 二.什么是垃圾回收机制? 三.为什么要用垃圾回收机制? 四.垃圾回收机制原理分析 4.1.什么是引用计数? 4.2.引用计数扩展阅读 一 引入 解释器在执行到定义变量的语法时,会申请内 ...

  4. JS实现表格隔行变色

    用到的鼠标事件:(1)鼠标经过 onmouseover:(2)鼠标离开 onmouseout 核心思路:鼠标经过 tr 行的时候,当前行会改变背景颜色,鼠标离开的时候去掉背景颜色. 注意:第一行(th ...

  5. poj 2559 Largest Rectangle(单调栈)

    Largest Rectangle in a Histogram Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 26549 ...

  6. 翻译一篇英文文章,主要是给自己看的——在ASP.NET Core Web Api中如何刷新token

    原文地址 :https://www.blinkingcaret.com/2018/05/30/refresh-tokens-in-asp-net-core-web-api/ 先申明,本人英语太菜,每次 ...

  7. Python3学习笔记(十三):装饰器

    装饰器就是一个闭包,它的主要作用是在不改变原函数的基础上对原函数功能进行扩展. 我们先来写一个简单的函数: from time import sleep def foo(): print(" ...

  8. JAVA静态方法是否可以被继承

    结论:java中静态属性和静态方法可以被继承,但是没有被重写(overwrite)而是被隐藏.原因:1). 静态方法和属性是属于类的,调用的时候直接通过类名.方法名完成对,不需要继承机制及可以调用.如 ...

  9. Xcode 4.1实用小工具:模拟网络连接和带宽

    暂无评论 适用于Mac OS X Lion的开发套件Xcode 4.1中,有个新鲜的小工具叫做Network Link Conditioner(网络连接调节器),是一款具有高度可定制性的辅助工具,让用 ...

  10. Android动态广播的注册与销毁

    一个内部类:BroadcastReceiver的子类,并定义收到广播之后的操作: class LockScreenBroadcastReceiver extends BroadcastReceiver ...