B+树

  1. 具有n个关键字的节点含有n个分支。而在B树中,具有n个关键字的节点含有n+1个节点。
  2. B+树的叶子节点包含了所有关键字,并且包含信息。
  3. B+树非叶子节点只起索引作用,不存数据。
  4. B+数在叶子节点使用指针将前后磁盘块中的索引连接起来,形成一个线性链表,方便范围查询。

什么是索引

索引是数据表中对字段进行排序的一种数据结构。常用的索引有

B树 哈希索引 全文索引 Rtree索引

AVL树,B树,B+树,红黑树,哈希表。

哈希表和B树不利于范围查找。红黑树在数据量大的时候性能会下降。

**聚集索引:**数据和索引在一起的。

**非聚集索引:**索引文件和数据文件是分离的。

联合索引:对多个字段同时建立的索引。Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分,跳跃索引查询就会导致索引失效。

B树和B+树的区别

  1. B树:叶节点具有相同的深度,所有索引元素不重复,节点中的数据索引从左到右递增排列。
  2. B+树:非叶子节点不存储数据,只存储索引,叶子节点包含了全部的关键字且存储数据。叶子节点用指针连接从左往右递增排序,提高区间访问的性能。

mysql存储引擎myISAM和InnoDB

存储引擎是基于表的,而不是数据库。

  1. InnoDB引擎:支持事务,行锁(适合高并发),支持外键。mysql5.5版本后的默认存储引擎
  2. myISAM引擎:不支持事务,不支持外键,支持表锁。优势是访问的速度快。mysql5.5版本前的默认存储引擎。myISAM索引文件和数据文件是分离的。查询较多的更新较少的情况下使用myisam存储引擎。

数据库三大范式

  1. 数据库中的所有字段都是不可分割的原子值
  2. 满足第一范式的前提下,除主键外的每一列都必须完全依赖于主键。如果不完全依赖,只能发生在联合主键下。
  3. 满足第二范式的前提下,除开主键列的其他列之间不能有传递依赖关系。

事务的四个特性ACID

事务是作为单个逻辑工作单元执行的一系列操作。要么完全执行,要么完全不执行。

  1. **原子性 :**同一事务中多个操作不能分割,必须是一个整体。
  2. **一致性 :**事务操作前后的总量保持一致。
  3. **隔离性 :**多个事务之间的操作互不干扰。
  4. **持久性:**事务提交以后,对数据库中数据的改变是永久的。

事务隔离级别

事务分为四个隔离级别:分别是读未提交,读提交,可重复读,串行化。从前往后隔离级别依次递增,同时执行效率依次下降。mysql的默认隔离级别是可重复读。

  1. 读未提交:会产生脏读,即一个事务读取了另一个事务未提交的内容。
  2. 读提交:可以解决脏读问题,但是会产生不可重复读,即一个事务在执行的过程中得到的结果不一致。
  3. 可重复读:可以解决不可重复读的问题,但会产生幻读,即一个事务无法看到另一个事务已经提交的内容。
  4. **串行化:**可以解决幻读问题。当同一张表被另一个事务操作时,其他事务的写操作是不可以进行的,进入串行化排队,直到另一个结束,同时还为超时的情况下才可以继续执行。
set global transaction isolation level read committed # 修改隔离级别'

select @@x_isolation  # 查看隔离级别

主键和外键约束

主键:**唯一且非空。**一个表有且只能由一个主键约束。创建主键会自动创建对应的索引,同样删除主键,对应的索引也会被删除。

外键约束:如果定义了外键约束,主表中没有的数据在子表中是不可以被使用的。主表中的记录被子表引用,是不可以被删除的。

inner join 和 left join

  1. 等值联接:inner join返回两个表中联接字段相等的行
  2. 左联接:left join 返回左表所有记录和右表中联接字段相等的记录,如果左表中的记录在右边不存在,则对应字段设为null。

redis

是C语言编写的基于内存可持久化的key-value内存数据库,使用的是epoll单线程模型。常用的数据结构有set, list,string, hash, sorted set。

查询

分组查询:count() sum() max() min() avg()

聚合查询:7种 A B A∪B A∩B A - A∩B B - A∩B A∪B - A∩B

左连接: A - A∩B 右连接:B - A∩B 内连接:A∩B

悲观锁和乐观锁

  1. 悲观锁: 每次去拿数据时都认为别人会修改,所以每次在拿数据的时候都会上锁。悲观锁由数据库自己实现,共享锁和排他锁是悲观锁的不同实现。悲观锁的缺点:效率低,并行差,增加死锁的概率。
  2. 乐观锁:每次去拿数据都认为别人不会修改,所以不会上锁。乐观锁适用于读多,写少的场景。乐观锁常见的实现方式:版本号机制和CAS自旋算法。乐观锁的缺点:ABA问题,循环时间长开销大,只能保证一个共享变量的原子操作。

explain 查看执行计划

使用explain关键字可以模拟优化器执行sql查询语句,从而知道mysql是如何处理sql语句的。分析查询语句或表结构的性能瓶颈。

explain + sql语句

show profile

用来分析当前会话中语句执行的资源消耗情况。

什么时候应该创建索引

  1. 频繁查询字段

什么时候不应该创建索引

  1. where条件里用不到的字段
  2. 频繁更新的字段
  3. 表记录太少<300W
  4. 重复且平均的表字段

B+树

B+树是B树的变形,B+树非叶子节点只存索引,不存数据,叶子节点存储所有的索引和数据。B+树三层可以存储上百万条数据,磁盘IO最多三次,每次读取磁盘块到内存后,使用二分查找找到索引的位置。

B+树是聚集索引,数据和索引在一起。B+树使用指针将叶子节点的连接起来。

B树

是一种多路平衡二叉树,m阶B树,每个节点最多可以有m-1关键字。所有叶子节点在同一层。每个节点保存索引和数据。

索引

索引是按照某个字段排序的数据结构。

ACID

事务时单个逻辑工作单元的一系列操作。

原子性:事务的操作是不可分割的,要么完全成功,要么完全失败。

一致性:事务操作前后的总量保持不变。

隔离性:事务之间的操作应该相互隔离。

持久性:事务一旦提交后,数据库中的值不可更改。

事务的隔离级别

  1. 读未提交:产生脏读,即一个事务可以读取另一个事务未提交的内容。
  2. 读提交:解决脏读,产生不可重复读,即事务的两次读取结果不一致。
  3. 可重复读:解决不可重复读,但是会产生幻读,即一个事务明明提交了,但是在另一个事务中没有更新。
  4. 串行化:当两个事务都在写入内容时,必须排队,当两个事务提交后,才可以执行后续事务。

数据库三大范式

  1. 数据库中的所有字段都是不可分割的原子值
  2. 在满足第一范式的前提下,除开主键外的其他列都必须完全依赖于主键。
  3. 在满足第二范式的前提下,除开主键外的其他列之间不能有传递依赖关系。

myisam和innoDB

myisam不支持事务,不支持外键,支持表锁。查询速度较快。适合读多更新少的表。

innoDB支持事务,支持外键,支持行锁,因为锁的粒度比较小,所以适合高并发。

持久化

利用永久性存储介质将数据进行保存,在特定的时间将保存的数据进行恢复的机制叫做持久化。确保数据安全。

  1. 将当前数据状态进行保存,快照形式。RDB
  2. 将数据的操作过程进行保存,日志形式。AOF