Mysql总结1

1、Mysql中的MyISAM与InnoDB的区别?

(1)InnoDB存储引擎支持事务,而MyISAM不支持事务;

(2)InnoDB支持行级锁,而MyISAM只支持表级锁;

( InnoDB行锁是通过给索引加锁实现的,即只有通过索引条件检索数据,InnoDB才使用行级锁,否则将使用表级锁!行级锁在每次获取锁和释放锁的操作需要比表级锁消耗更多的资源。MySQL表级锁有两种模式:表共享读锁和表独占写锁。就是说对MyIASM表进行读操作时,它不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写操作;而对MyISAM表的写操作,会阻塞其他用户对同一表的读和写操作。)

(3)InnoDB支持外键,而MyISAM不支持外键;

(4)InnoDB不保存数据库表中表的具体行数,而MyISAM会保存;

( 也就是说,执行 select count(*) from table 时,InnoDB要扫描一遍整个表来计算有多少行,而MyISAM只需要读出保存好的行数即可(内部维护了一个计算器,可以直接调取)。【注】:当count(*)语句包含where条件时,两种表的操作是一样的。也就是上述介绍到的InnoDB使用表锁的一种情况。)

对于select ,update ,insert ,delete 操作:

  如果执行大量的SELECT,MyISAM是更好的选择(因为MyISAM不支持事务,使得MySQL可以提供高速存储和检索,以及全文搜索能力)

  如果执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表(因为InnoDB支持事务,在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了)

 

2、什么是事务?事务的特征是什么?

事务就是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。

四大特征:

  原子性、一致性、隔离性、持久性  (ACID)

  原子性:是指整个数据库事务是不可分割的单位。只有使事务中的所有数据库操作都成功,才算整个事务成功。如果事务中任何一个sql语句执行失败,那么已经执行的sql语句也必须撤销,事务状态退回到执行事务之前的状态。

  一致性:一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态。在事务开始之前和事务结束之后,事务的完整性约束没有被破坏。

  隔离性:一个事务的影响在该事务提交前对其他事物都不可见。——这通过锁来实现

  持久性:事务一旦提交,其结果就是永久性的。

 

3、InnoDB如何保证事务的四大特性?

MySQL的存储引擎InnoDB使用重做日志(redo log)保证一致性与持久性

            回滚日志(undo log)保证原子性

            使用各种锁来保证隔离性

 

4、MySQL数据库提供的四种隔离级别?

  • read uncommitted(读未提交)
  • read committed(读已提交)
  • repeatable read(可重复读)InnoDB的默认隔离级别
  • serializable(串行)

 5、数据库的乐观锁和悲观锁是什么?

乐观锁:假设不会发生并发冲突,只在提交的时候检查是否发生并发冲突。可以使用版本号机制CAS算法实现。

版本号机制:一般在数据表中加一个数据版本号version字段,表示数据被修改的次数,当数据被修改时version值加一。当线程A要更新数据值时,在读取数据的同时也会读取version值,在提交更新时,若当前读取到的version值与第一次读取到的数据库version值相等时才更新,否则重试更新操作,直到更新成功。

CAS机制:即compare and swap(比较与交换),无锁编程,在不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,因此也叫非阻塞同步。

悲观锁:假定会发生并发冲突,在读取的时候就对数据进行加锁, 在该用户读取数据的期间,其他任何用户都不能来修改该数据,但是其他用户是可以读取该数据的, 只有当自己读取完毕才释放锁。

  在数据库中可以使用Repeatable Read的隔离级别(可重复读)来实现悲观锁,它完全满足悲观锁的要求(加锁)。Java中synchronizedReentrantLock等独占锁就是悲观锁思想的实现。

两种锁的使用场景:

乐观锁性能好,但是无法解决脏读问题

悲观锁能解决脏读问题,开销较大,而且加锁时间较长,对于并发的访问性支持不好。

  如果冲突很少,或者冲突的后果不会很严重,那么通常情况下应该选择乐观锁,因为它能得到更好的并发性;

  如果冲突太多或者冲突的结果对于用户来说痛苦的,那么就需要使用悲观策略,它能避免冲突的发生。

  一般乐观锁适用于写比较少的情况下(多读场景),即冲突真的很少发生的时候;悲观锁适用于多写的情况,多写的情况一般会经常产生冲突。

6、共享锁与排它锁?

共享锁和排它锁是具体的锁,是数据库机制上的锁。

  • 共享锁(读锁): 在同一个时间段内,多个用户可以读取同一个资源,读取的过程中数据不会发生任何变化。读锁之间相互不阻塞, 多个用户可以同时读,但是不能允许有人修改。 
  • 排它锁(写锁): 在任何时候只能有一个用户写入资源,当进行写锁时会阻塞其他的读锁或者写锁操作,只能由这一个用户来写,其他用户既不能读也不能写。

加锁会有粒度问题,从粒度上从大到小可以划分为 :

  • 表锁:开销较小,一旦有用户访问这个表就会加锁,其他用户就不能对这个表操作了,应用程序的访问请求遇到锁等待的可能性比较高。
  • 页锁:是MySQL中比较独特的一种锁定级别,锁定颗粒度介于行级锁定与表级锁之间,所以获取锁定所需要的资源开销,以及所能提供的并发处理能力也同样是介于上面二者之间。另外,页级锁定和行级锁定一样,会发生死锁。
  • 行锁:开销较大,能具体的锁定到表中的某一行数据,但是能更好的支持并发处理, 会发生死锁。

 7、索引是什么?MySQL数据库几个基本的索引类型?

索引是对数据库表中一或多个列的值进行排序的结构,利用索引可快速访问数据库表的特定信息。

普通索引、唯一索引、主键索引、联合索引、全文索引

  • 唯一索引:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
  • 主键索引:是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。 为表定义主键将自动创建主键索引。(数据库表某列或列组合,其值唯一标识表中的每一行。该列称为表的主键。)
  • 联合索引:指对表上的多个列做索引。只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀原则。
  • 全文索引:主要用来查找文本中的关键字,而不是直接与索引中的值相比较。目前只有char、varchar,text 列上可以创建全文索引。

 8、为数据表建立索引的原则有哪些?

  • 在最频繁使用的、用以缩小查询范围的字段上建立索引。
  • 在频繁使用的、需要排序的字段上建立索引。

9、B+树索引、哈希索引?

Hash索引和B+树索引的特点:

  • Hash索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位;

  • B+树索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问。

Hash索引与B+树索引区别?

  • 如果是等值查询,那么哈希索引明显有绝对优势,因为只需要经过一次算法即可找到相应的键值;当然了,这个前提是,键值都是唯一的。如果键值不是唯一的,就需要先找到该键所在位置,然后再根据链表往后扫描,直到找到相应的数据;
  • 从示意图中也能看到,如果是范围查询检索,这时候哈希索引就毫无用武之地了,因为原先是有序的键值,经过哈希算法后,有可能变成不连续的了,就没办法再利用索引完成范围查询检索;
  • 同理,哈希索引也没办法利用索引完成排序,以及like ‘xxx%’ 这样的部分模糊查询(这种部分模糊查询,其实本质上也是范围查询);
  • 哈希索引也不支持多列联合索引的最左匹配规则
  • B+树索引的关键字检索效率比较平均,不像B树那样波动幅度大,在有大量重复键值情况下,哈希索引的效率也是极低的,因为存在所谓的哈希碰撞问题

10、B树和B+树的区别?

B+树是一种平衡查找树在B+树中,所有记录节点都是按键值的大小顺序存放在同一层的叶节点中,各叶结点指针进行连接。

(平衡二叉树AVL:首先符合二叉查找树的定义(最结点的值比根节点小,右结点的值比根结点大),其次必须满足任何节点的左右两个子树的高度最大差为1。)

  • B树  :每个节点都存储key和data,所有节点组成这棵树,并且叶子节点指针为nul,叶子结点不包含任何关键字信息
  • B+树:所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接,所有的非终端结点可以看成是索引部分。

11、为什么说B+比B树更适合实际应用中操作系统的文件索引和数据库索引?

(1)B+的磁盘读写代价更低

  B+的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对B树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说IO读写次数也就降低了。

(2)B+tree的查询效率更加稳定

  由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。

12、聚集索引和非聚集索引区别?

数据库中的B+索引可以分为聚集索引和辅助聚集索引。不管是聚集索引还是非聚集的索引,其内部都是B+树的,即高度平衡的,叶节点存放着所有的数据,聚集索引与非聚集索引不同的是,叶节点存放的是否是一整行的信息

  • 聚集索引(clustered index):

  聚集索引就是按照每张表的主键构造一颗B+树并且叶节点中存放着整张表的行记录数据,因此也让聚集索引的叶节点成为数据页。聚集索引的这个特性决定了索引组织表中数据也是索引的一部分。由于实际的数据页只能按照一颗B+树进行排序,因此每张表只能拥有一个聚集索引

  聚集索引表记录的排列顺序和索引的排列顺序一致,所以查询效率快,只要找到第一个索引值记录,其余就连续性的记录在物理也一样连续存放。聚集索引对应的缺点就是修改慢,因为为了保证表中记录的物理和索引顺序一致,在记录插入的时候,会对数据页重新排序。

  • 非聚集索引(nonclustered index)(也叫辅助索引):

  对于辅助索引(非聚集索引),叶级别不包含行的全部数据。聚集索引键来告诉InnoDB存储引擎,哪里可以找到与索引相对应的行数据。辅助索引的存在并不影响数据在聚集索引中的组织,因此每张表上可以有多个辅助索引通过辅助索引来寻找数据时,InnoDB存储引擎会遍历辅助索引并通过叶级别的指针获得指向主键索引的主键,然后再通过主键索引来找到一个完整的行记录

  非聚集索引指定了表中记录的逻辑顺序,但是记录的物理和索引不一定一致,两种索引都采用B+树结构,非聚集索引的叶子层并不和实际数据页相重叠,而采用叶子层包含一个指向表中的记录在数据页中的指针方式。非聚集索引层次多,不会造成数据重排。

根本区别:

聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致。

13、什么是视图?视图的使用场景有哪些?

视图(View)是一个命名的虚表,它由一个查询来定义,可以当作表使用。

视图有什么用(应用场景)

1、当一个查询你需要频频的作为子查询使用时,视图可以简化代码,直接调用而不是每次都去重复写这个东西。
2、系统的数据库管理员,需要给他人提供一张表的某两列数据,而不希望他可以看到其他任何数据,这时可以建一个只有这两列数据的视图,然后把视图公布给他。

 

15、数据库设计准则(第一、第二、第三范式说明)

第一范式(1NF)每个列都不可以再拆分。

第二范式(2NF)在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。

第三范式(3NF)在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键

数据范式详细参考地址

数据库大厂高频面试题和答案

 

 

参考博客:https://www.cnblogs.com/toria/p/11204226.html

     https://www.cnblogs.com/aishangJava/p/11306919.html

 

posted @ 2020-11-21 00:27  奇遇yms  阅读(144)  评论(0编辑  收藏  举报