💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] # :-: **数据库三大范式是什么** 第一范式:每个列都不可以再拆分。 第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。 第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。 在设计数据库结构的时候,要尽量遵守三范式,如果不遵守,必须有足够的理由。比如性能。事实上我们经常会为了性能而妥协数据库的设计。 # :-: **MySQL存储引擎MyISAM与InnoDB区别** mysql引擎有9种:一般常用的有2种Innodb,MyISAM ![](https://img.kancloud.cn/5f/ad/5fad7c2187cece0b79a5a642a8ccc2c2_555x376.png) **Innodb引擎:** Innodb引擎提供了对数据库ACID事务的支持。并且还提供了行级锁和外键的约束。它的设计的目标就是 处理大数据容量的数据库系统。 **主要特性有:** * [ ] 支持事务回滚,确保数据的一致性要求 * [ ] 灾难恢复性好 * [ ] 为处理巨大数据量的最大性能设计 * [ ] 实现了缓冲管理,不仅能缓冲索引也能缓冲数据,并且会自动创建散列索引以加快数据的获取 * [ ] 支持外键完整性约束。存储表中的数据时,每张表的存储都按逐渐顺序存放,如果没有显示在表定义时指定主键,InnoDB会为每一行生成一个6B的ROWID,并以此作为主键。 * [ ] 被用在众多需要高性能的大型数据库站点上 **MyISAM引擎:** 基于 ISAM 的存储引擎,并对其进行扩展。它是在Web、数据存储和其他应用环境下最常使用的存储引擎之一。MyISAM 拥有较高的插入、查询速度,但不支持事务。在 MySQL5.5.5 之前的版本中,MyISAM 是默认的存储引擎。 **主要特性有:** * [ ] 不支持事务 * [ ] 使用表级锁,并发性差 * [ ] 主机宕机后,MyISAM表易损坏,灾难恢复性不佳 * [ ] 可以配合锁,实现操作系统下的复制备份、迁移 * [ ] 只缓存索引,数据的缓存是利用操作系统缓冲区来实现的。可能引发过多的系统调用且效率不佳 * [ ] 数据紧凑存储,因此可获得更小的索引和更快的全表扫描性能 * [ ] 可以把数据文件和索引文件放在不同目录 * [ ] 使用 MyISAM 引擎创建数据库,将产生3个文件。文件的名字以表的名字开始,扩展名指出文件类型:frm 文件存储表定义,数据文件的扩展名为 .MYD(MYData),索引文件的扩展名是 .MYI(MYIndex)。 ### 应用场景 如果没有特别的需求,使用默认的`Innodb`即可。 MyISAM:以读写插入为主的应用程序,比如博客系统、新闻门户网站。 Innodb:更新(删除)操作频率也高,或者要保证数据的完整性;并发量高,支持事务和外键。比如OA自动化办公系统。 # :-: **MySQL事务** **四大特性**:`原子性`、`隔离性`、`一致性`、`持久性`简称 ACID,缺一不可。 MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务! 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。 事务用来管理 insert,update,delete 语句 一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。 **原子性**: 一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。 **一致性:** 在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。 **隔离性:** 数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。 **持久性:** 事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失 # :-: **MySQL事务隔离级别的实现原理** PS:事务隔离级别是MySQL事务四大特性中的隔离性 SQL 标准定义了四种隔离级别,MySQL 全都支持。这四种隔离级别分别是: 1. 读未提交(READ UNCOMMITTED)-脏读 2. 读提交 (READ COMMITTED) 3. 可重复读 (REPEATABLE READ)-幻读 4. 串行化 (SERIALIZABLE) 从上往下,隔离强度逐渐增强,性能逐渐变差。采用哪种隔离级别要根据系统需求权衡决定,其中,**可重复读**是 MySQL 的默认级别。 事务隔离其实就是为了解决上面提到的脏读、不可重复读、幻读这几个问题,下面展示了 4 种隔离级别对这三个问题的解决程度。 | 隔离级别 | 脏读 | 不可重复读 | 幻读 | | --- | --- | --- | --- | | 读未提交 | 可能 | 可能 | 可能 | | 读提交 | 不可能 | 可能 | 可能 | | 可重复读 | 不可能 | 不可能 | 可能 | | 串行化 | 不可能 | 不可能 | 不可能 | 只有串行化的隔离级别解决了全部这 3 个问题,其他的 3 个隔离级别都有缺陷 # :-: **索引** ### **什么是索引?** 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。 索引是一种数据结构。数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。 更通俗的说,索引就相当于目录。为了方便查找书中的内容,通过对内容建立索引形成目录。索引是一个文件,它是要占据物理空间的。 ### **索引有哪些优缺点?** 索引的优点 * 可以大大加快数据的检索速度,这也是创建索引的最主要的原因。 * 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。 索引的缺点 * 时间方面:创建索引和维护索引要耗费时间,具体地,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,会降低增/改/删的执行效率; * 空间方面:索引需要占物理空间。