点击蓝字之后,我们就是好朋友了啦
15
数据库篇(一)
01
事务概念及应用场景
事务
是一组不可分割的mysql语句组,这些语句组要么全部执行成功,要么全部执行失败。事务的提出主要是为了解决并发情况下
保持数据一致性
的问题。
02
事务四大特性
原子性
:事务是指不可分割的工作单位
一致性
:指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏
隔离性
:多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果
持久性
:事务一旦提交,它对数据库中的改变就是永久性的
03
数据库三大范式
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。 而通常我们用的最多的就是第一范式(1NF)、第二范式(2NF)、第三范式(3NF)。
第一范式(1NF)
:要求数据库表的每一列都是不可分割的原子数据项。
第二范式(2NF)
:在1NF的基础上,非码属性必须完全依赖于候选码,需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关。
第三范式(3NF)
:在2NF基础上,任何非主属性不依赖于其它非主属性,需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
04
数据库查询慢的原因
1、没有索引或者没有用到索引
2、I/O吞吐量小,形成了瓶颈效应
3、没有创建计算列导致查询不优化
4、内存不足
5、网络速度慢
6、查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7、锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)
8、sp_lock,sp_who,活动的用户查看,原因是读写竞争资源
05
悲观锁和乐观锁
悲观锁
(Pessimistic Lock),每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。(实现:在sql语句后面加上for update)
乐观锁
(Optimistic Lock),每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。(实现:在表上加version)
△
▴
Hard Work Pays Off
06
索引优缺点
优点
:
1、通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
2、可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
3、可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
缺点
:
1、创建索引和维护索引要耗费时间
2、索引需要占物理空间
3、当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
07
索引种类
1、普通索引
:最基础的索引,没有任何限制
2、唯一索引
:唯一索引是不允许其中任何两行具有相同索引值的索引
3、聚簇索引
:表中行的物理顺序与键值的逻辑(索引)顺序相同
4、非聚簇索引
:数据库表中记录的物理顺序与索引顺序可以不相同
08
聚簇索引与非聚簇索引
聚簇索引
:将数据存储与索引放到了一块,找到索引也就找到了数据。
非聚簇索引
:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,把索引先缓存到内存中,当需要访问数据时(通过索引访问数据),在内存中直接搜索索引,然后通过索引找到磁盘相应数据,这也就是为什么索引不在key buffer命中时,速度慢的原因。
09
B+树和hash索引
Hash索引
底层是哈希表,哈希表是一种以key-value存储数据的结构,所以多个数据在存储关系上是完全没有任何顺序关系的,所以,哈希索引只适用于等值查询的场景。如果有大量重复键值的情况下,哈希索引的效率会很低,因为存在哈希碰撞问题。
B+树
是一种多路平衡查询树,所以他的节点是天然有序的(左子节点小于父节点、父节点小于右子节点),所以对于范围查询的时候不需要做全表扫描 。
10
MySQL数据表的切分原则
水平切分
:将某个访问极其平凡的表再按照某个字段的某种规则来分散到多个表之中,每个表中包含一部分数据。就是按照数据行的切分,就是将表中的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中。
垂直切分
:将不同的表分散到不同的数据库主机中。
当命运递给我一个酸的柠檬时,
让我们设法把它制造成甜的柠檬汁。
——雨果
End