数据库 学习笔记

本文介绍了数据库事务的基本概念,包括原子性、一致性和隔离性,并探讨了脏读、幻读和不可重复读的问题。此外,还对比了MyISAM和InnoDB存储引擎的区别,重点讲解了索引的种类,如B+树在MySQL中的应用,以及mongoDB的索引类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本概念

数据库事务是什么?

  1. 数据库事务是指作为单个逻辑工作单元执行的一系列操作,这些操作要么全做,要么全部做,是一个不可分割的工作单元。
  2. 事务的开始与结束可以由用户显示的控制。如果用户没有显式地定义事务,则由DBMS按照默认的规定自动划分事务。事务分为 原子性、一致性、独立性 及 持久性 等特点。

事务的基本要素?

原子性:

事务必须是原子工作单元。对数据的修改要么都执行,要么都不执行。

一致性:

事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。

独立性:

由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。

持久性:

事务完成之后,它对于系统的影响是永久性的。该修改即使出现致命的系统故障也将一直保持。

脏读、幻读、不可重复读?

脏读

就是A事务访问了数据库,还没进行修改,B事务也访问了数据库,并且已经做了修改。

幻读

是指当事务不是独立执行时发生的一种现象。 A事务修改表中所有数据,而B事务插入一条新数据,而这条新数据就没有被修改。

不可重复读

是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。

注:不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。

事务隔离级别

Read Uncommitted 读未提交:不允许第一类更新丢失。允许脏读,不隔离事务。
Read Committed 读已提交:不允许脏读,允许不可重复读。
Repeatable Read 可重复读:不允许不可重复读。但可能出现幻读。
Serializable 串行化:所有的增删改查串行执行。

MyISAM 和 InnoDB 的区别有哪些?

  1. InnoDB 支持事务,MyISAM 不支持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一
  2. InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM 会失败
  3. InnoDB 是聚集索引,MyISAM 是非聚集索引。聚簇索引的文件存放在主键索引的叶子节点上,因此 InnoDB 必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而 MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的
  4. InnoDB 不保存表的具体行数,而MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快
  5. InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限。这也是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一

应用场景

1、MyISAM管理非事务表,提供高速存储和检索以及全文搜索能力,如果再应用中执行大量select操作,应该选择MyISAM

2、InnoDB用于事务处理,具有ACID事务支持等特性,如果在应用中执行大量insert和update操作,应该选择InnoDB

索引

索引可以理解为目录,把一些关键信息用一种数据结构存储起来,达到高效查询搜索的目的。

mongoDB 基本概念

是非关系型数据库, 或者叫文档型数据库, 基于json document.

mongoDB 有哪些索引

单键索引

在一个键上创建的索引就是单键索引,单键索引是最常见的索引,如MongoDB默认创建的_id的索引就是单键索引

复合索引

在多个键上建立的索引就是复合索引

多键索引

如果在一个数组上面创建索引,MongoDB会自己决定,是否要把这个索引建成多键索引。

地理空间索引

MongoDB支持几种类型的地理空间索引。其中最常用的是 2dsphere 索引(用于地球表面类型的地图)和 2d 索引(用于平面地图和时间连续的数据)。

全文本索引

全文索引用于在文档中搜索文本,我们也可以使用正则表达式来查询字符串,但是当文本块比较大的时候,正则表达式搜索会非常慢,而且无法处理语言理解的问题(如 entry 和 entries 应该算是匹配的)。使用全文索引可以非常快地进行文本搜索,就如同内置了多种语言分词机制的支持一样。创建索引的开销都比较大,全文索引的开销更大。创建索引时,需后台或离线创建。

哈希索引

全文索引用于在文档中搜索文本,我们也可以使用正则表达式来查询字符串,但是当文本块比较大的时候,正则表达式搜索会非常慢,而且无法处理语言理解的问题(如 entry 和 entries 应该算是匹配的)。使用全文索引可以非常快地进行文本搜索,就如同内置了多种语言分词机制的支持一样。创建索引的开销都比较大,全文索引的开销更大。创建索引时,需后台或离线创建。

mysql 用B+树, mongoDB 用B-树 ,为什么?

(1)B-树的树内存储数据,因此查询单条数据的时候,B-树的查询效率不固定,最好的情况是O(1)。我们可以认为在做单一数据查询的时候,使用B-树平均性能更好。但是,由于B-树中各节点之间没有指针相邻,因此B-树不适合做一些数据遍历操作。

(2)B+树的数据只出现在叶子节点上,因此在查询单条数据的时候,查询速度非常稳定。因此,在做单一数据的查询上,其平均性能并不如B树。但是,B+树的叶子节点上有指针进行相连,因此在做数据遍历的时候,只需要对叶子节点进行遍历即可,这个特性使得B+树非常适合做范围查询

mysql 是 关系型数据库, 涉及遍历数据表的操作较多,B+ 树的子节点指针相连,查询效率更高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值