基本概念
数据库事务是什么?
- 数据库事务是指作为单个逻辑工作单元执行的一系列操作,这些操作要么全做,要么全部做,是一个不可分割的工作单元。
- 事务的开始与结束可以由用户显示的控制。如果用户没有显式地定义事务,则由DBMS按照默认的规定自动划分事务。事务分为 原子性、一致性、独立性 及 持久性 等特点。
事务的基本要素?
原子性:
事务必须是原子工作单元。对数据的修改要么都执行,要么都不执行。
一致性:
事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。
独立性:
由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。
持久性:
事务完成之后,它对于系统的影响是永久性的。该修改即使出现致命的系统故障也将一直保持。
脏读、幻读、不可重复读?
脏读
就是A事务访问了数据库,还没进行修改,B事务也访问了数据库,并且已经做了修改。
幻读
是指当事务不是独立执行时发生的一种现象。 A事务修改表中所有数据,而B事务插入一条新数据,而这条新数据就没有被修改。
不可重复读
是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。
注:不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。
事务隔离级别
Read Uncommitted 读未提交:不允许第一类更新丢失。允许脏读,不隔离事务。
Read Committed 读已提交:不允许脏读,允许不可重复读。
Repeatable Read 可重复读:不允许不可重复读。但可能出现幻读。
Serializable 串行化:所有的增删改查串行执行。
MyISAM 和 InnoDB 的区别有哪些?
- InnoDB 支持事务,MyISAM 不支持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一
- InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM 会失败
- InnoDB 是聚集索引,MyISAM 是非聚集索引。聚簇索引的文件存放在主键索引的叶子节点上,因此 InnoDB 必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而 MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的
- InnoDB 不保存表的具体行数,而MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快
- 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+ 树的子节点指针相连,查询效率更高。