【数据库】数据库 重点知识复习总结

✨数据库的三大范式?

  • 第一范式:每个列都不可以再拆分。
  • 第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。
  • 第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。

✨事务的特性?

事务有四大特性,分别是ACID

  • 原子性(Atomicity): 一个事务被视为最小的不可分割的一部分,事务的所有操作要么全部提交成功,要么全部失败回滚。
  • 一致性(Consistency)
    数据库在事务执行前后都保持一致性状态。在一致性状态下,所有事务对同一个数据的读取结果都是相同的。
  • 可见性(Isolation)
    一个事务所做的修改在最终提交以前,对其它事务是不可见的。
  • 持久性(Durability)
    一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失

✨并发环境下事务可能出现什么问题?

并发环境下,由于事务的隔离性很难保证,所以会出现一系列的并发问题。

  • 脏读:读脏数据指在不同的事务下,当前事务可以读到另外事务未提交的数据。
  • 幻读:幻读是指一个事务统计了总数,另一个事务插入或删除一个数据,当地一个事务再次统计时,发现两次读取的总数不一致
  • 不可重复读:不可重复读指在一个事务内多次读取同一数据集合。在这一事务还未结束前,另一事务也访问了该同一数据集合并做了修改,由于第二个事务的修改,第一次事务的两次读取的数据可能不一致

✨事务隔离级别有什么?

为了保证并发操作的安全,所以引入了事务的不同隔离级别:

  • 读未提交(read uncommitted):一个事务还没有提交,他做的更改就可以被其它事务看到。
  • 读提交(read committed):一个事务提交以后,他做的更改才可以被其它事务看到。
  • 可重复读(repeatable read):一个事务再执行过程中看到的数据,总和这个事务在启动时看到的数据一致。
  • 串行化(serializable):对于同一行记录,读会加“读锁”,写会加“写锁”当发生冲突时,后一个事务必须等前一个事务完执行成后才能继续执行。

隔离的级别越高,相对就越安全,效率也就越低。在MySQL中的默认隔离级别是:可重复读, 而在SQL Sever 和Oracle 中默认隔离级别是:读提交

✨MySQL是怎么实现可重复读的隔离级别?

MySQL的InnoDB引擎使用多版本并发控制(Multi-Version Concurrency Control, MVCC)来实现可重复读这种隔离级别。它是在每个事务开始前增加一个版本快照,在这个事务执行期间,读数据都是读到的事务开始时的快照的值,如果进行写操作可以读到最新值后进行写。MVCC 规定了只能读取已经提交的快照
而MVCC在实现时,时使用Undo log ,每一个数据的修改都会在Undo log中有记录,通过回滚指针,可以访问到不同版本下的数据的值。在访问数据时,会比较事务开始时的版本号和该数据的版本号,来决定是否可以读到该数据。

✨MySQL的索引使用什么数据结构?为什么?

MySQL的InnoDB引擎使用B+树来存储数据,在每一个节点中进行二分查询,查到节点后继续按照树的索引找到下一个节点。B+树相对于红黑树、平衡树都有更好的磁盘访问效率,它的优点有:

  1. 树高度更低,由于具体数据都是存放在叶子节点中,所以非叶子节点就可以多存放更多的节点,这样也提升了磁盘访问的效率。
  2. 更好的区间查询,由于B+树的叶子节点会通过链式形式进行连接,相比于平衡树需要跨节点访问而言,B+树只需要在叶子节点通过链表的形式就可以查询到
  3. 查询性能更加稳定,对于B+树,每次都要查询到叶子节点,因此查询效率是稳定的

✨使用索引有什么好处?

  • 使用索引可以大大的减少服务器要扫描数据的行数
  • 将随机IO转为顺序IO(B+树是有序的,将相邻的数据存储在一起)
  • 帮助服务器进行排序和分组的操作,避免产生临时表(B+索引是有序的,可以用于 ORDER BY 和 GROUP BY 操作)

✨为什么一条SQL语句执行比较慢?

导致SQL语句执行较慢有很多原因,这里列出其中几种:

  • 字段上没有索引
  • 有索引但是没有使用到(对字段进行了函数操作等)
  • 没有获取到锁
  • Undo log 过多

具体参见 一条SQL语句为什么执行这么慢?

✨主键索引和普通索引的区别?

主键索引在一个表中只能有一个,也称为聚簇索引,它的叶子节点存放的数据是整行的数据
普通索引在一个表中可以有多个,也成为二级索引,它的叶子节点存放的是主键索引的值
对于在主键索引上查找数据,找到叶子节点就找到了具体的数据,对于普通索引找到叶子节点后还要进行回表,到主键索引上查找需要的数据

✨什么是前缀索引?

前缀索引就是对于一个联合索引来说,在进行查询操作时会以最左前缀的规则来进行匹配。如果匹配到,就可以使用这个索引。
比如有一个(a,b)的索引,有一个语句是对a字段进行查询,就可以匹配到(a,b)索引,而要想对b索引进行查询就不可以匹配到。

✨什么是覆盖索引?

如果一个普通索引的叶子节点已经包含了需要查找的值
使用覆盖索引有以下好处:

  • 索引通常远小于数据行的大小,只读取索引能大大减少数据访问量。
  • 一些存储引擎(例如 MyISAM)在内存中只缓存索引,而数据依赖于操作系统来缓存。因此,只访问索引可以不使用系统调用(通常比较费时)。
  • 对于 InnoDB 引擎,若辅助索引能够覆盖查询,则无需回表

以上知识具体参见:关于MySQL索引的基础知识

✨了解InnoDB存储引擎?

  • 它是 MySQL 默认的事务型存储引擎,只有在需要它不支持的特性时,才考虑使用其它存储引擎。
  • 实现了四个标准的隔离级别,默认级别是可重复读(REPEATABLE READ)。在可重复读隔离级别下,通过多版本并发控制(MVCC)+ Next-Key Locking 防止幻影读。
  • 主索引是聚簇索引,在索引中保存了数据,从而避免直接读取磁盘,因此对查询性能有很大的提升。
  • 内部做了很多优化,包括从磁盘读取数据时采用的可预测性读、能够加快读操作并且自动创建的自适应哈希索引、能够加速插入操作的插入缓冲区等。
  • 支持真正的在线热备份。其它存储引擎不支持在线热备份,要获取一致性视图需要停止对所有表的写入,而在读写混合场景中,停止写入可能也意味着停止读取。

✨了解MyISAM存储引擎?

  • 设计简单,数据以紧密格式存储。对于只读数据,或者表比较小、可以容忍修复操作,则依然可以使用它。
  • 提供了大量的特性,包括压缩表、空间数据索引等。
  • 不支持事务。
  • 不支持行级锁,只能对整张表加锁,读取时会对需要读到的所有表加共享锁,写入时则对表加排它锁。但在表有读取操作的同时,也可以往表中插入新的记录,这被称为并发插入(CONCURRENT INSERT)。
  • 可以手工或者自动执行检查和修复操作,但是和事务恢复以及崩溃恢复不同,可能导致一些数据丢失,而且修复操作是非常慢的。
  • 如果指定了 DELAY_KEY_WRITE 选项,在每次修改执行完成时,不会立即将修改的索引数据写入磁盘,而是会写到内存中的键缓冲区,只有在清理键缓冲区或者关闭表的时候才会将对应的索引块写入磁盘。这种方式可以极大的提升写入性能,但是在数据库或者主机崩溃时会造成索引损坏,需要执行修复操作。

✨InnoDB和MyISAM的区别?

  • 事务:InnoDB 支持事务,MyISM不支持事务
  • 并发:MyISAM 只支持表级锁,而 InnoDB 支持行锁
  • 外键:InnoDB 支持外键。
  • 备份:InnoDB 支持在线热备份。
  • 崩溃恢复:MyISAM 崩溃后发生损坏的概率比 InnoDB 高很多,而且恢复的速度也更慢。
  • 其它特性:MyISAM 支持压缩表和空间数据索引。

✨说一下数据库字段的数据类型

在这里插入图片描述

✨说说主从库复制

主要涉及三个线程:binlog 线程、I/O 线程和 SQL 线程。

  • binlog 线程 :负责将主服务器上的数据更改写入二进制日志(Binary log)中。
  • I/O 线程 :负责从主服务器上读取二进制日志,并写入从服务器的中继日志(Relay log)。
  • SQL 线程 :负责读取中继日志,解析出主服务器已经执行的数据更改并在从服务器中重放(Replay)。
    主服务器处理写操作以及实时性要求比较高的读操作,而从服务器处理读操作。

✨读写分离能提高性能的原因在于?

  • 主从服务器负责各自的读和写,极大程度缓解了锁的争用;
  • 从服务器可以使用 MyISAM,提升查询性能以及节约系统开销;
  • 增加冗余,提高可用性。
  • 读写分离常用代理方式来实现,代理服务器接收应用层传来的读写请求,然后决定转发到哪个服务器。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章