python面试问技术栈_Python面试综合--DB相关

Python面试综合--DB相关

关系型数据库:MySQL,Oracle,Postgrel, MariaDB, SQL Server等

优点

易用性:都是使用表结构,格式一致,支持sql语言

支持复杂查询:多表连表查询

缺点

读写性能较差,海量数据时瓶颈出现

灵活度不高

高并发情况下硬盘IO出现瓶颈

非关系型数据库(Not Only SQL):Redis,Memcached, MongoDB, Hbase等

优点

格式灵活

扩展性高

速度快

成本低

MySQL

存储引擎

MyISAM

InnoDB

Merge

Memory

索引

聚集索引

非聚集索引

普通索引

唯一索引

组合索引

索引存储原理

B+树结构如下:

版本变迁及特性

Mysql5.7新变化特性有:

灵活性上开始支持json串格式字段

generated column. 即数据库中的这一列由其他列计算而得。例如,知道直角三角形的两条直角边,要求直角三角形的面积。

性能提升:自动检测只读事务, 支持并行复制(slave-parallel-type)

Mysql 8.0变化特性有:

mysql8开始支持文档存储。开发人员可以将无模式 JSON 文档集合与关系表放在一起使用(文档是一堆键值对的集合,表现为 JSON 结构)

性能大幅提升。速度比5.7快两倍,在读写工作负载、IO密集型工作负载、高竞争工作负载

默认字符编码改为了utf8mb4

事务及事务隔离

RU(readuncommited)未提交读; 缺陷:不可重复读现象

RC(read commited) 提交读; 缺陷:脏读

RR(repeatable read) 可重复读; 缺陷:虚读/幻读

MVCC

MVCC (多版本并发控制)

基本原理:某个时间点快照

每行数据都存在一个版本,每次数据更新时都更新该版本

修改时Copy出当前版本随意修改,各个事务之间无干扰

保存时比较版本号,如果成功(commit),则覆盖原记录;失败则放弃copy(rollback)

InnoDB 中MVCC是如何实现的?

创建时版本号

删除时版本号

事务版本号

MVCC适用场景:RC、RR

MySQL中MVCC 特性:写锁存在,只利用其中的读非阻塞

示例面试(1)

问题:知道mysql的事务隔离吗?/事务隔离分哪几个级别?/事务隔离性怎么保证/...

回答思路:

空间线

ACID

事务隔离的四个级别(概念及优缺点)

MySQL事务隔离性和其他DB区别

思路串联:

事务ACID-->事务隔离级别及分析-->MySQL事务隔离特性(留MVCC和GapLock引子)

示例答案:

数据库支持事务本身需要有具备四个特性:原子性、一致性、隔离性和持久性,也即ACID。其中事务的隔离性简单来说就是并发执行的多个事务之间互不干扰。

​ 事务隔离总体分为四个级别:第一个是RU(未提交读),该级别事务内容易出现脏读的情况,即事务A读到了事务B没有提交的数据;为了解决脏读问题,可以提高事务隔离级别到RC(提交读),此时事务A不会读到其他事务未提交的数据,但又产生了一个新的现象:事务A执行的过程中,有可能另外一个事务B提交了数据,此时事务读取的数据和之前不一致,即出现了不可重复读的问题;所以mysql的InnoDB本身默认采用了第三个事务隔离级别RR(可重复读),该级别使用MVCC(多版本并发控制)解决重复读的问题,一般的RR级别会出现幻读的问题,及同一个事务多次执行同一个select,读取到的数据行发生了改变,这是因为数据行发生了行数减少或者新增;而最高的事务隔离级别是SE(可序列化),该方式下事务相当于串行执行,解决了脏读、不可重复读、幻读等问题,但对性能和效率的影响很大,生产环境中很少会使用该隔离级别;

​ 具体到mysql中,mysql默认的RR级别有一些特别,因为其引入了GAP LOCK(间隙锁)的概念,可在RR级别即可解决幻读的问题;另外一个特性是mysql里的MVCC只解决读-写的阻塞问题,写-写依然还是阻塞的。

MongoDB

存储引擎

MMAP

WiredTiger

RocksDB

Memory

WiredTiger:

3.2版本默认存储引擎都改为了wiredtiger

特性:

文档级别锁,解决了锁粒度过大的问题

磁盘数据压缩

删除数据时,数据会立即删除

MongoDB3.0在多线程、批量插入场景下较之于MongoDB2.6有大约4-7倍的增长

Rocksdb:

特性:

顺序写入:LSM Tree结构,随机写入转换为顺序写入

速度稳定:和WiredTiger相比,写速度稳定

版本变迁及特性

MongoDB 3.0特性(2015年):

特性:

顺序写入:LSM Tree结构,随机写入转换为顺序写入

速度稳定:和WiredTiger相比,写速度稳定

顺序写入:LSM Tree结构,随机写入转换为顺序写入

速度稳定:和WiredTiger相比,写速度稳定

MongoDB 4.0特性(2018年6月):

特性:

多文档事务支持

4.2版本开始支持分片集群分布式事务

底层存储机制

空间局部性原理

B树:

尽可能少减少磁盘IO

查询性能快(O(1) --O(LogN))

B树(4阶)结构如下:

和MySQL对比

海量数据读写,频次高 -- MongoDB

关系型结构较多,应用场景事务要求高 -- MySQL

其他:成本、意愿、技术栈

集群及发展

常见的扩展方法:

a. 水平扩展:分库,分collection

b. 垂直扩展:分片(类似于mysql中分区)

Redis

存储类型

string

list

set

zset

hash

使用场景

缓存高频次访问的数据,降低数据库io

分布式架构,做session共享

利用zset类型可以存储排行榜

利用list做简易MQ或存储最新的n个数据

存储机制

list键:双向链表

hash键:字典dict

zset键:跳跃表zskiplist

ziplist:节省内存空间

集群

Twitter开发的twemproxy

豌豆荚开发的codis

redis官方的redis-cluster

Bloom

Bloom Filter算法:

对于有n个元素的集合S={x1, x2,……,xn},我们用k个哈希函数(h1,h2,……,hn),分别将S中的每一个元素映射到一个m位的位数组(bm-1bm-2……b1b0)中。该位数组在初始化时所有置为0,每当用哈希函数映射到该位时则将该位置为1。对于已经置为1的位则不在反复置1。

如下图展示x1,x2, x3的插入过程:

查找时性能:

线性结构: O(N)

二叉树:O(logN)

Bloom:O(1)

列式数据库

OLTP(on-line transaction processing ): 联机事务处理

OLAP(on-line Analytical Processing):联机分析处理

交易性数据库:oracle、sqlserver、mysql

分析性数据库:hbase、hive、clickhouse

数据库仓库

一般使用列式数据库:

数据来源多个系统

多维度统计数据

更新数据少

...

行式和列式对比

行存储:数据存储一行接一行;

列存储:一列的所有数据放一起;

示例面试(2)

问题:MySQL和MongoDB区别?

思路:

时间线

2015年,MySQL5.7发布,开始支持json

2018年,MySQL8.0版本,支持文档存储

2018年,MongoDB4.0发布,支持多文档事务

空间线

MySQL存储引擎及底层存储B+树

Mongodb存储引擎及底层存储B树

DB选型考虑因素

思路串联:

MySQL存储引擎及结构介绍--MongoDB存储引擎及结构介绍-->MySQL和MongoDB区别(夹杂时间线)--> DB选型因素--> 埋下一个问题引子(事务相关)

示例答案:

​MySQL是关系型数据库的一种,其存储引擎有MyISam, InnoDB,Merge等,目前在业界中大多使用的支持事务InnoDB存储引擎,从15年MySQL5.7开始,MySQL开始支持json格式(开始向nosql数据库靠近);而MongoDB去年8月份发布的最新版本4.0开始支持多文档事务,当前其默认的存储引擎wiredtiger性能非常卓越;

​ mysql和MongoDB数据库发展越来越类似,都在取其精华,在具体的数据库选型时,两种DB底层的实现机制可能是一大考虑因素。mysql索引底层是用B+树实现的,而MongoDB则是采取的B树,B树的结构也就决定了MongoDB在海量读写的情况下性能比mysql卓越(时间复杂度是O(1)-O(logN)), 而MySQL B+树的特性也决定了MySQL更适合多区间范围查询的业务需求。

​ 当然,在具体的项目DB选择过程中,我们还需要考虑到成本、团队成员的意愿、技术栈等情况。总的来说,在当前的情况下,如果是海量数据高并发读写,从技术的角度推荐使用MongoDB,如果数据结构相对统一,同时对于事务有较高要求,个人倾向于MySQL。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果在使用Python的SQLAlchemy库中的`create_all()`方法创建表时,出现了db-journal文件的题,这可能是由于数据库事务未正确提交导致的。下面是一些可能的解决方案: 1. 提交事务:在执行`create_all()`方法后,确保调用`commit()`方法提交数据库事务。这将确保所有表的创建操作被持久化到数据库中。示例代码如下: ```python from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker # 创建数据库引擎 engine = create_engine('your_database_url') # 创建Session Session = sessionmaker(bind=engine) session = Session() # 创建表 # ... # 提交事务 session.commit() ``` 2. 关闭连接:在执行完`create_all()`方法后,调用`session.close()`方法关闭数据库连接。这将确保数据库连接被正确释放,并且不会留下db-journal文件。示例代码如下: ```python from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker # 创建数据库引擎 engine = create_engine('your_database_url') # 创建Session Session = sessionmaker(bind=engine) session = Session() # 创建表 # ... # 关闭连接 session.close() ``` 3. 使用数据库管理工具:如果以上方法无效,可以尝试使用数据库管理工具来处理db-journal文件。例如,对于SQLite数据库,可以使用SQLite命令行工具或第三方SQLite管理工具来删除db-journal文件。 请注意,具体的解决方案可能因使用的数据库类型和版本而有所不同。如果上述方法无法解决题,建议查阅相关数据库文档或寻求相关技术支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值