MySQL 整理
数据库概念
ACID
- ACID是事物的四个特性。分别是 原⼦性
(Atomicity)、⼀致性(*Consistency)、隔离性
(Isolation)、持久性(Durability) 。 - 原⼦性是指事物是⼀个不可分割的⼯作单位,事
物中的操作要么都发⽣,要么都不发⽣。最经典
的就是转账案例,我们把转⼊和转出当做⼀个事
物的话,就需要在SQL中显式指定开启事务。 - ⼀致性是说数据库事务不能破坏关系数据的完整
性以及业务逻辑上的⼀致性 。我们可以从数据库
层⾯和业务层⾯两⽅⾯来保证,数据库层⾯我们
可以设置触发器,外键,表,⾏约束等来保证,
业务层⾯就是我们Java⼯程师的⼯作 - 隔离性指的是多个事务并发访问时,事务之间是
隔离的,⼀个事务不应该影响其它事务运⾏效
果。 多个事务并发访问时,事务之间是隔离的,
⼀个事务不应该影响其它事务运⾏效果。 这个点
⼜引申出了下⾯两道题,以及后边的加锁和阻塞 - 持久性意味着即使出现了任何事故⽐如断电等,
事务⼀旦提交,则持久化保存在数据库中,不会被回滚
脏读,不可重复读和幻读
- 脏读: 意味着⼀个事务读取了另⼀个事务未提交
的数据,⽽这个数据是有可能回滚的。即这个事
物读取的数据是不正确的 - 不可重复读: 在数据库访问中,⼀个事务范围内
两个相同的查询却返回了不同数据。这是由于查
询时系统中其他事务修改的提交⽽引起的。即这
个事物在读的过程中被修改了 - 幻读:当⼀个事物对整个table进⾏修改之后,第
⼆个事物向表中插⼊了⼀⾏数据,此时第⼀个事
物发现了新插⼊的没有修改的数据⾏,好像发⽣
了幻觉⼀样
数据库的隔离级别
- 读未提交RU
- ⼀个事务还没提交时,它做的变更就能被别的
事务看到 - 会出现幻读,不可重复读,脏读
- 更新数据时加上⾏级共享锁,事物结束即释放
-
读已提交RC
- ⼀个事务提交之后,它做的变更才会被其他事
务看到 - 会出现幻读,不可重复读,不会出现脏读
- 写数据加⾏级排他锁,这样写过程是⽆法读取
的,直到事务处理完毕才释放排他锁,给读的数据加⾏级共享锁,这样读的时候也是⽆法写的,
但是⼀旦读完该⾏就释放共享锁 - MySQL会在SQL语句开始执⾏时创建⼀个视图
- ⼀个事务提交之后,它做的变更才会被其他事
-
可重复读RR
- ⼀个事务执⾏过程中看到的数据,总是跟这个
事务在启动时看到的数据是⼀致的 - 会出现幻读,不会出现不可重复读、脏读
- 给写的数据假行级排他锁,事物结束释放,给读的数据加行级共享锁,事物结束后释放
- MySQL会在事物开始时创建⼀个⼀致性视图(接
下⾯的MVCC),事物结束时销毁
- ⼀个事务执⾏过程中看到的数据,总是跟这个
-
可串⾏化S
- 当出现读写锁冲突的时候,后访问的事务必须
等前⼀个事务执⾏完成,才能继续执⾏ - 不会出现幻读,不可重复读,脏读
- 事务读数据则加表级共享锁,事务写数据则加
表级排他锁 - 不区分快照度与当前读
- 当出现读写锁冲突的时候,后访问的事务必须
其中,Oracle和SQLServer都是读已提交,但MySQL默认的隔离级别是可重复读 ,这是⼀个MySQL5.0之前的上古遗留版本问题。当时的binlog只有STATEMENT格式,⽤RC会出现bug。
三⼤范式
- 第⼀范式: 所有字段值都是不可分解的原⼦值 。
例如有⼀个列是电话号码⼀个⼈可能有⼀个办公
电话⼀个移动电话。第⼀范式就需要拆开成两个
属性 - 第⼆范式:⾮主属性完全函数依赖于候选键。如
PersonID,ProductID,ProductName,
PersonName可以看到,OrderID和ProductID是
联合主键,但是ProductName是依赖于
ProductID的,只依赖了部分主键,没有依赖全部
主键。需要拆分成三个表: PersonID,
PersonName , ProductID, ProductName
和 PersonID, ProductID - 第三范式: 每⼀列数据都和主键直接相关,⽽不
能间接相关,如OrderID,ProductID,ProductName,
OrderID是主键,但是ProductID依赖了OrderID,
⽽ProductName依赖了ProductID,等于说是间
接依赖了OrderID,所以需要拆分为两个表:OrderID, ProductID 和 ProductID,ProductName- 范式的优点:因为相对来说有较少的重复数据,
范式化的更新操作要⽐反范式快。同时范式化需
要更少的distinct和order by - 范式化缺点:通常需要关联,不仅代价昂贵,也
可能会使的⼀些索引⽆效
- 范式的优点:因为相对来说有较少的重复数据,
- 常⽤的反范式⽅法:
- 复制:在两个表中根据实际业务情况存储部分
相同的字段列,即有利于查询,也不会把表搞的
太⼤ - 缓存:对于需要多次join查询的表,可以在⼀个
表中加⼊⼀个缓存列,⽤来缓存所join表的部分
常⽤数据,如count等,我们需要实时更新该缓
存
- 复制:在两个表中根据实际业务情况存储部分
内连接和外连接
内连接也叫⾃然连接,只有两个表相匹配的⾏才能
在结果集中出现。返回的结果集选取两个表中所匹
配的数据,舍弃不匹配的数据
select fieldlist from table1 [inner] join
table2 on table1.column = table2.colum
- 内连接保证两个表中的所有⾏都满⾜条件,⽽外连
接则不然,外连接不仅仅包含符合连接条件的⾏,
⽽且还包括左表(左外连接),右表(右外连
接),或者两个边表(全外连接)中的所有数据⾏
select fieldlist from table1 left/ right outer
join table2 on table1.column =
table2.column
MySQL索引
索引是⼀种数据结构,⽤于帮助我们在⼤量数据中
快速定位到我们想要查找的数据。可以加快查的速
度,但是会增加容量,降低增,删,改的速度
MySQL的索引类型,特点
常⻅的MySQL索引结构有B-树索引,B+树索引,
Hash索引和全⽂索引
- B-Tree索引
- 因为存储引擎不⽤进⾏全表扫描来获取数据,
直接从索引的根节点开始搜索,从⽽能加快访问
数据的速度 - B-Tree对索引是顺序组织存储的,很适合查找
范围数据 - 适⽤于全键值、键值范围或者键前缀查找(根
据最左前缀查找 - 限制:对于联合索引来说,如果不是从最左列
开始查找,则⽆法使⽤索引;不能跳过索引中的
- 因为存储引擎不⽤进⾏全表扫描来获取数据,
- B+Tree索引
- 是B-Tree索引的变种,现在主流的存储引擎都
不⽤单纯的B-Tree,⽽是其变种B+Tree或者T-Tree等等 - 和B-Tree最主要的区别就是B+Tree的内节点不
存储data,只存储key,叶⼦节点不存储指针
- 是B-Tree索引的变种,现在主流的存储引擎都
- Hash索引
- 基于Hash表实现,只有Memory存储引擎显式
⽀持哈希索引 - 适合等值查询,如 = 、 in() 、 <=> ,不⽀
持范围查询 - 因为不是按照索引值顺序存储的,就不能像
B+Tree索引⼀样利⽤索引完成排序 - Hash索引在查询等值时⾮常快
- 因为Hash索引始终索引的所有列的全部内容,
所以不⽀持部分索引列的匹配查找 - 如果有⼤量重复键值得情况下,哈希索引的效
率会很低,因为存在哈希碰撞问题 - 程序员可以在B+Tree索引的基础上创建⾃适应
Hash索引
- 基于Hash表实现,只有Memory存储引擎显式
- 全文索引
- MyISAM和InnoDB都⽀持全⽂索引
- 有三种模式:⾃然语⾔模式,布尔模式和查询
扩展模式
- R-Tree索引
- MyISAM⽀持R-Tree索引,这个和全⽂索引基
本不问
- MyISAM⽀持R-Tree索引,这个和全⽂索引基
B+树索引和hash索引的区别
- B+树索引适合返回查找,⽽hash索引适合等值查
询 - hash索引⽆法利⽤索引完成排序,但是B+树索引
可以 - hash索引不⽀持多了联合索引的最左匹配规则,
但是B+树索引⽀持 - 如果有⼤量重复键值的情况下,因为存在hash碰
撞,hash索引的效率会很低
B树和B+树的区别
⼆叉树
- 任何节点的左⼦节点的键值都⼩于当前节点的键值,右⼦节点的键值都⼤于当前节点的键值
- 平衡⼆叉树/AVL树
- 当⼆叉树⾮常极端,变成⼀个链表后,它就没有了⼆叉树的相关优秀性质了。所以我们在insert节点的时候,需要不断的旋转,来使⼆叉树平衡,最终使得其查询效率最⾼。调整⼀共分为四种情况:LL,RR,LR,RL
- B-树
- 因为数据库中⼤部分数据都存在于磁盘,但是IO⼀次磁盘的代价相对来说⽐较⼤,我们需要尽可能的减少AVL树的深度,即增加每个节点的数据量。这便是B-树的由来
- 每⼀个节点称为⻚,也就是⼀个磁盘块。 B树相对于平衡⼆叉树,每个节点存储了更多的键值(key)和数据(data),并且每个节点拥有更多的⼦节点
- B+树
- 是B-树的变形,相对于B-树来说,B+树最主要的不同之处就是其⾮叶⼦节点上是不存储数据的,数据全在叶⼦节点存储。这就意味着B+树⽐B-树更胖因为B+树索引的所有数据均存储在叶⼦节点,⽽且数据是按照顺序排列的。那么B+树使得范围查找,排序查找,分组查找以及去重查找变得异常简单。⽽B树因为数据分散在各个节点,要实现这⼀点是很不容易的
小伙伴们,点赞支持一下哦!
转载:https://blog.csdn.net/sison1999/article/details/115483352
查看评论