1、数据库中的事务
1.什么是事务?
一个不可分割的数据库操作的序列,也是数据库并控制的基本单元,结果必须使得数据库从一种一致的状态转换为另一种一致的状态,要么都执行要么都不执行。
2.事务的四大特性(ACID)
1.原子性:事务时最小的执行单位不可以被分割。
2.一致性:执行事务的前后,数据保持一致性,多个事务对统一数据的读取是一致的。
3.隔离性:并发访问数据库的时候,一个用户的事务不可以被其他的事务所干扰,并发事务之间的数据库是独立的。
4.持久性:一个事务的改变对数据库中的数据是持久的,即使数据库发生的故障也不会使数据改变。
3.什么是脏读,幻读,不可重复读?
1.脏读:某一个事务更新了一份数据,另一个事务在此时读取了一份相同的数据,到那时由于某原因,前一个事务回滚了操作,则后一个事务所读取的数据时不正确的。
2.不可重复读:一个事务两次查询中的数据时不一致的。
3.幻读:一个事务两次查询的数据是不一致的,一个事务的两次查询中,中间有一个新的事务对表中的数据进行了修改。
2、事务中的隔离级别,MySQL中默认的隔离级别是什么?
为了达到事务的四大特性,数据库定义了四种不同的隔离级别,来解决,脏读,幻读,不可重复读
SQL标准定义了四种隔离级别:
- 读取未提交(read-uncommitted):最低的隔离级别,允许读取尚未提交的数据变更,可能导致出现,脏读,幻读,不可重复度。
- 读取已提交(read-committed):允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读和不可重复读还有可能发生。
- 可重复读(repeatable-read):对同一个字段的多次读取结果时同步的,除非数据是被事务本身所修改的,可以解决脏读,不可重复读,但是不可以阻止幻读。
- 可串行化(serializable):最高的隔离级别,完全服从ACID的隔离级别,事务依次执行,事务之间完全不可能产生干扰。
注意:Mysql 默认采用的 REPEATABLE_READ隔离级别
3、数据库中的锁?
锁机制:当数据库有并发的事务时,可能会产生数据的不一致,这个时候需要一些机制来保证访问的次序。这种机制就叫锁机制。
4、按照锁的粒度分数据库锁有哪些?锁机制与InnoDB锁算法?
在关系型数据库中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎)、表级锁(MYISAM引擎)和页级锁(BDB引擎 )。
1.行级锁:时mysql锁中粒度最细的锁,表示只对当前操作的行进行加锁,大大减少了数据库操作之间的冲突,但是开销也是最大的,行级锁分为:共享锁和排他锁。
特点:开销大;加锁慢;会出现死锁;粒度最小;发生锁冲突的概率低,并发度高
2.表级锁 表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。最常使用的MYISAM与INNODB都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。
特点:开销小;加锁快;不会出现死锁;锁粒度大;发生锁冲突的概率高;并发度低
3.页级锁 页级锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。
特点:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般
5、从锁的类别上将都存在哪些锁呢?会不会阻碍并发率?
1.共享锁:又叫做读锁:当用户进行数据的读取时候,对数据加上共享锁,共享锁可以同时加上多个。
2.排他锁:又叫做写锁:当用户进行数据写入时候,对数据加上排他锁,排他锁只有一个,它和其他的共享锁排他锁都互斥。
锁的粒度取决于具体的存储引擎,InnoDB实现了行级锁,页级锁,表级锁。
6、MySQL中InnoDB引擎的行锁是怎么实现的?
答:InnoDB是基于索引来实现行锁的,
例: select * from tab_with_index where id = 1 for update;
for update可以根据条件来完成行锁的锁定,并且id是有索引的那一列,如果id不是索引键,那么InnoDB将完成表锁,并发将无从谈起。
7、什么是死锁?如何解决?
死锁是指两个或者多个事务在同一个资源上相互占用,并请求锁定对方的资源而导致的恶性循环的现象。
1.同一个事务中,尽可能做到一次性锁定所有的资源,减少死锁发生的概率。
2.如果不同的程序会并发存取多张表,尽量约定以相同的顺序访问表,可以大大降低死锁的概率。
3.对于非常容易产生死锁的业务可以尝试使用升级锁的粒度。
8、数据库中的乐观锁和悲观锁的什么?如何实现的?
乐观锁和悲观锁是并发控制主要采取的手段
乐观锁:假设不会发生冲突,只在提交的时候检查是否违反了数据的完整性,在修改数据的时候将事务锁起来。
悲观锁:假设会发生冲突,屏蔽一切可能违反数据完整性的操作,查询完数据的时候将事务锁起来,直到提交事务。
适合使用的场景?
乐观锁适合(写较少的情况下)也就是冲突真的很少发生,这样可以省去了锁的开销,加大了系统的整个吞吐量。
悲观锁:如果是多写的情况下,一般会发生冲突,所以一般多写的场景下用悲观锁就比较合适。
9、什么是视图?为什么要使用视图?
本质上是一种虚拟表,在物理上是不存在的,其内容与真实的表相似,包含一系列带有名称的列和行数据。但是,视图并不在数据库中以储存的数据值形式存在。行和列数据来自定义视图的查询所引用基本表,并且在具体引用视图时动态生成。
视图的优点?
1、视图的列可以来自不同的表。
2、视图是由基本表(实表)产生的表(虚表)
3、视图的建立和删除不会影响基本表
4、对视图的增、删、改会直接影响基本表
5、如果视图来自多个基本表的时候,不允许添加和删除数据。
视图使用的场景?
1.根本用途:简化sql,提高开发的效率。
下面是视图的常见使用场景:
重用SQL语句;
简化复杂的SQL操作。在编写查询后,可以方便的重用它而不必知道它的基本查询细节;
使用表的组成部分而不是整个表;
保护数据。可以给用户授予表的特定部分的访问权限而不是整个表的访问权限;
10、什么是索引?
索引是一种文件,它包含了对数据表中所有记录的一个引用指针。
索引是一种数据结构,数据库索引是数据库管理系统中的一个排序的数据结构,以协助快速查询和更新表中的数据,索引的实现通常使用B树或者是B+树。
更加通俗的说,索引就相当于一个目录,方便查找书中的内容。
索引的优缺点?
优点:
1、大大加快数据的检索速度,也就是创建索引的主要原因。
使用索引可以在查询的过程中,使用优化隐藏器,提高系统的性能。
缺点:
1.创建索引和维护索引是需要时间的,会降低增删改的执行效率。
2.索引需要占用物理空间。
使用场景:
where:
order by
join on:
索引的类型有哪些?
主键索引:数据列不可以重复,不可以为null,一个表只可以有一个主键
唯一索引:数据列允许重复,允许为null,一个表允许多个列创建唯一索引
普通索引:基本的索引类型,没有唯一性的限制,有允许为null
全文索引:母亲啊搜索引擎使用的一种关键技术。
索引的数据结构:
InnoDB存储引擎的默认索引实现为:B+树索引。
B树索引是Mysql数据库中使用最频繁的索引类型,基本所有存储引擎都支持BTree索引。
索引的基本原理?
索引是用来快速寻找具有特定值的记录,如果没有索引那么就需要遍历整张表。
原理:将无序的数据变成有序的查询。
1.将创建了索引的列的内容进行排序
2.对排序结果生产倒排表
3.在倒排表内容上拼接数据地址链
4.查询的时候先拿到倒排表,再取出数据地址链,然后找到具体的数据。
创建索引的原则?
1.左前缀匹配原则,mysql会一直向左匹配直到遇到查询范围就停止匹配。
2.频繁作为查询条件的字段才会去创建索引。
3.更新频繁的字段不适合创建索引。
4.不能有效区分数据的列不可以作为索引。
5.定义有外键的列一定要建立索引。
6.尽量扩展索引,不要更新索引。
什么是最左前缀原则?什么是最左匹配原则?
1.顾名思义,就是最左优先,在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。
2.最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配。
B树和B+树的区别?
1、在B树中,你可以将键和值存放在内部节点和叶子节点;但在B+树中,内部节点都是键,没有值,叶子节点同时存放键和值。
2、B+树的叶子节点有一条链相连,而B树的叶子节点各自独立。
数据库为什么使用B+树而不是B树?
1、B树只适合随机检索,而B+树即适合随机检索,又适合顺序检索。
2、B+树空间利用率高,可以减少I/O的次数,磁盘的读写代价低。
3、B+树的查询效率更加稳定,B+树中,顺序检索比较明显,随机检索时,任何关键字的查找都必须走一条从根节点到叶节点的路,所有关键字的查找路径长度相同,导致每一个关键字的查询效率相当。
4、B-树在提高了磁盘IO性能的同时并没有解决元素遍历的效率低下的问题。
5、增删文件(节点)时,效率更高。因为B+树的叶子节点包含所有关键字