文章目录

  • 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值都存储在叶子结点,非叶子节点只进行数据索引。