MySQL基础概念

MySQL 概念笔记

1. 什么是关系数据库?

MySQL 是一款开源、免费、跨平台的关系型数据库。那么什么是关系型数据库,其实就是数据都是使用二维表(行 + 列)来存储数据,然后表和表可以通过外键来建立表和表的关系。像 Redis,其实就是一种键值对数据。这种定义的方法,最大的区别应该是数据存储的结构不同吧。

2. 存储引擎是什么?

第一步中已经知道数据在数据库中的结构,然后现在就需要存储引擎了,而存储引擎就决定了数据怎么存,索引怎么实现,支不支持事务。MySQL 一般默认引擎为 InnoDB。

3. 索引是什么?

一句话:加速查询数据库数据的数据结构,相当于书的目录。既然是一种数据结构,那么这个结构到底是怎么样的?InnoDB 引擎的索引是一个 B+ 树。

InnoDB 有两大索引类型(为什么说 InnoDB 有呢,因为每个存储引擎肯定都有自己的数据存储方式,索引实现方式)。

  • 主键索引:他是聚簇索引/聚集索引,就是把索引和数据放到一个数据结构里面。一张表有且只有一个主键索引,主键索引的 B+ 树叶子节点存储的是整行数据,所以通过非叶子节点上的主键找到叶子节点的数据。
  • 二级索引(非聚簇索引,普通索引):索引和部分真实数据不在同一个 B+ 树中,单独建立了 B+ 树,非叶子节点存索引列的值(导航用),叶子节点存储的是主键值以及索引值。

4. 什么是回表?

举一个例子:表 user(id 主键, name, age),给 name 建索引。查询:select * from user where name='张三' 的时候,这是一个普通索引,通过张三在普通索引的 B+ 树的叶子节点上找到了张三的 id 和张三的名字。但是我们要查询的整行记录,这个时候只能拿着张三的 id 去主键索引里查找整行记录了,这就是回表,一次查询经过了两颗索引树,查询速度必然慢了不少。如何解决?把需要查询的字段也加入到索引中。

5. 什么复合索引(联合索引)?

把多个字段一起建立索引就是复合索引。复合索引遵循最左前缀原则。比如:ndex_idx_a_b(a,b)。

  • 能命中:where a=?、where a=? and b=?
  • 不能命中:where b=?(跳过左边字段)

6. 索引优缺点

  • 优点:大幅度加快查询速度。
  • 缺点:占用额外磁盘空间,写入变慢。因为,建立索引底层需要加入索引值到里面,增删改都需要改动索引,也就是 B+ 树。

7. 什么是事务?

事务就是一组 SQL 语句,要么全部成功失败,全部全部失败回滚,不会出现只执行一半的情况。

8. 事务的特性

1. 原子性

事务是最小不可拆分单元。要么全成,要么全回滚(回到没有执行事务的状态),不存在中间状态。靠 undo log(回滚日志)实现。(其实就是在操作前把要操作的数据备份,任何一条 SQL 语句失败都还原)

2. 一致性

事务执行前后,数据的业务规则是合法的。(执行成功的话一定是单条事务执行的成功后的状态)

3. 隔离性

多个事务并发执行的时候,互相之间要隔离,互不干扰。隔离性由隔离级别控制,隔离级别越低,并发越高,但是越容易出现问题。下面是一些出现问题的术语:

  • 脏读:一个事务读到了另一个事务还没提交的数据(对方回滚,读到的数据就是脏的)
  • 不可重复读:同一个事务内,两次读同一行数据,结果不一样(别的事务修改并提交了)
  • 幻读:同一个事务内,两次查询,行数变了(别的事务插入 / 删除提交了)

四个隔离级别(从低到高):

隔离级别脏读不可重复读幻读
读未提交 READ UNCOMMITTED有有有
读已提交 READ COMMITTED (RC)无有有
可重复读 REPEATABLE READ (RR,InnoDB 默认级别)无无大部分解决(MVCC + 间隙锁)
串行化 SERIALIZABLE无无无

串行化:最高级别,所有事务串行执行,没有上面三个问题,性能最差。

4. 持久性(Durability)

事务一旦 commit 提交成功,修改的数据永久保存,就算数据库宕机、断电,数据也不会丢失。靠 redo log(重做日志)实现。因为 commit 的时候数据还没有写入磁盘,这时候断电仍能通过 redo log 恢复。

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP