文章目录
- 1、事务的四个特性和四个隔离等级
- 2、悲观锁和乐观锁
- 悲观锁
- 乐观锁
- 3、索引
- 为什么要选择自增列当主键
- 哈希索引
- 什么情况下不适合建立索引
- B树和B+树区别
- 4、MySQL存储引擎
- MyISAM和InnoDB区别
- InnoDB和MyISAM如何选择
- 5、分区和分表
- 分表的类型
- 分表的好处
- 分区类型
- 分区的优点和缺点
- 分表和分区的区别
- 6、MVCC
- 7、数据库的锁
- 8、为什么InnoDB采用B+树
1、事务的四个特性和四个隔离等级
这是一个超链接
特性:原子性、一致性、隔离性、持久性。 隔离等级:读未提交、读已提交、可重复读、序列化
2、悲观锁和乐观锁
这是一个超链接
悲观锁
悲观锁:对外界修改数据持保守态度。认为外界会修改数据。
悲观锁会在修改记录之前,对数据进行加锁。成功加锁后,开始修改记录,事务结束后才解锁。
悲观锁的实现往往依靠数据库提供的锁机制。
悲观锁主要分为共享锁和排他锁
共享锁:就是读锁。多个事务可以一起获得共享锁,可以对数据进行读但不可修改
排他锁:就是写锁。当一个事务获得了排他锁后,其他事务都不可获得排他锁和共享锁。获得排他锁的事务可以对数据进行修改
悲观锁适合于写操作较多的情况
优点:为数据处理的安全提供了保证
缺点:因为会加锁,会让数据库产生额外的开销,降低了效率,还有增加了产生死锁的机会,降低了并行性
乐观锁
乐观锁:认为外界修改数据是概率很小的事件,在提交的时候才去判断是不是存在冲突。
乐观锁是先进行数据修改,然后判断是不是存在冲突,不存在就提交事务进行更新。
乐观锁的实现不依靠数据库,而是依靠数据本身
主要有两种方式可以实现乐观锁,一是通过CAS算法,二是通过版本号
乐观锁适合于读操作较多写的情况
优点:响应效率高,较好的实现了并行
缺点:如果冲突效率较高,乐观锁重试会反复执行,时间效率很低
3、索引
索引原理:这是一个超链接
索引详解:这是一个超链接
主键索引和非主键索引:这是一个超链接
为什么要选择自增列当主键
如果定义了主键,InnoDB会将主键作为聚集索引。如果没有主键,会将第一个非空并且唯一的字段作为主键。如果也没有,就会选择内置6字节的ROWID作为隐含的聚集索引。
数据存储在一颗B+树的叶子节点上,这就要求按顺序存放,如果空间够直接放,不够就开辟新的一页存放。如果主键不是自增的,那么也就是当前数据可能会插入任意一个位置,那么原来的结点就要后移,会产生大量的时间开销。
哈希索引
哈希索引最适合等值查询。不支持范围查询。不支持索引完成排序。不支持最左前缀。
什么情况下不适合建立索引
- 表记录太少
- 表的重复值很多,比如人员表中的性别字段就不适合建立索引
- 经常要增删改的字段不适合建立索引
B树和B+树区别
- B树上每个结点都存储了key和data值,而B+树的叶子节点才存储key和data值,除叶子节点外的其他结点存储的是key值。-
- B树不需要到叶子结点就可以找到对应数据,而B+树因为都存储在了叶子节点,所以一定要跑到叶子节点才能找到,相对稳定。
- B+树的叶子节点用链表连接了前后,支持区间查询
- 因为B+树的非叶子结点只存储了key值,所以一个节点能存储更多的key值,树高度较低,IO次数相对较少
4、MySQL存储引擎
这是一个超链接
MyISAM和InnoDB区别
- InnoDB支持事务,MyISAM不支持事务
- InnoDB支持外键,MyISAM不支持
- InnoDB使用的是聚集索引,MyISAM使用的是非聚集索引
- InnoDB不保存表的具体行数,MyISAM用一个变量保存了表的行数
- InnoDB的最小锁粒度是行级锁,而MyISAM最小锁粒度是表级锁
- InnoDB不支持全文索引,MyISAM支持全文索引
InnoDB和MyISAM如何选择
1、如果要支持事务,选择InnoDB
2、表的绝大多数都是读查询,考虑MyISAM
3、系统崩溃后,MyISAM恢复更困难
5、分区和分表
这是一个超链接
分表的类型
1.水平分表:将一张表的不同数据行分为多张表,通过采用hash、取模的方式分表
2.垂直分表:将一张表的不同字段放到一张表上
分表的好处
减少单张表的访问压力,减少数据库的负担,缩短查询时间
分区类型
rang分区、list分区、key分区、hash分区
分区的优点和缺点
优点:
1、存储更多数据。分区表的数据可以分布在不同的物理设备上,从而高效地利用多个硬件设备。和单个磁盘或者文件系统相比,可以存储更多数据
2、优化查询。在where语句中包含分区条件时,可以只扫描一个或多个分区表来提高查询效率;涉及sum和count语句时,也可以在多个分区上并行处理,最后汇总结果。
3、分区表更容易维护。例如:想批量删除大量数据可以清除整个分区。
缺点:
1、一个表最多只能有1024个分区
2、MySQL5.1中,分区表达式必须是整数,或者返回整数的表达式。在MySQL5.5中提供了非整数表达式分区的支持。
3、如果分区字段中有主键或者唯一索引的列,那么有主键列和唯一索引列都必须包含进来。即:分区字段要么不包含主键或者索引列,要么包含全部主键和索引列。
4、分区表中无法使用外键约束
5、MySQL的分区适用于一个表的所有数据和索引,不能只对表数据分区而不对索引分区,也不能只对索引分区而不对表分区,也不能只对表的一部分数据分区。
分表和分区的区别
分表是一张表分为多张表,分区在逻辑上只有一张表,底层是由多少物理区组成。
6、MVCC
这是一个超链接
这是一个超链接
MVCC即多版本并发控制机制。主要是用来实现读写的并发,并且不需要加锁,降低系统开销。InnoDB存储引擎通过保存数据某个时间的快照来实现,每行数据后面隐藏了两列,分别是创建版本号和删除版本号。
核心思想就是保存一个数据的多个版本号,使得当前读写不会产生冲突。
7、数据库的锁
这是一个超链接
8、为什么InnoDB采用B+树
InnoDB采用B+树结构,是因为B+树能够减少单次查询的磁盘访问次数,降低IO、提升性能。
B+树的key和data值都存储在叶子结点,非叶子节点只进行数据索引。