MySQL基础

112 阅读3分钟

来源

  1. # 01 | 基础架构:一条SQL查询语句是如何执行的?
  2. # 02 | 日志系统:一条SQL更新语句是如何执行的?

数据库基础

语句定义

  • DML(Data Manipulation Language)数据库操纵语言,它们就是INSERT、DELETE、UPDATE
  • DDL(Data Definition Language)数据库定义语言,主要有CREATE、ALTER、DROP等命令, 用于定义或修改表的结构、数据类型、表之间的链接和约束等
  • DQL(Data Query Language)数据库查询语言,即SELECT。
  • DCL(Data Control Language),数据库的控制功能,用来设置或者更改数据库访问权限

引擎选择

  • MyISAM不支持redo log、事务、行锁、

日志

redo log(引擎层日志,InnoDB独有) 和 binlog(server层日志)
WAL:Write-Ahead Logging,先写日志,再写磁盘。即对数据进行修改时,先写redo log日志,然后更新内存数据,最后在适当时候写磁盘(因为写磁盘耗IO,这样可以更快)
crash-safe:InnoDB通过redo log保证即使数据库重启,提交的就也不会丢失。为什么binlog不具备这种能力?因为binlog存只记录操作逻辑,而不会判断是否真的完成,重启后也无法判断哪些操作是否完成。 两种日志区别:

  1. redo log是InnoDB独有的,binlog是Sever层日志,任何存储引擎都能使用
  2. redo log是物理日志,记录“在某个数据页做了什么改动”;而binlog是逻辑日志,记录SQL语句的原始逻辑
  3. redo log是循环写(固定空间),写满之后需要写数据磁盘;而binlog是追加写,写满之后换一个文件,不会覆盖。

两阶段提交: 保证redo log 和 binlog 保存的逻辑是一致的(保证一致性)。 顺序:写redo log,然后处于preview阶段 -> 写binlog -> commit redo log

表底层存储

  1. 表结构:在8.0版本以前单独存储在.frm文件,80之后运行存在系统数据表
  2. 表数据:通过参数 innodb_file_per_table控制,值为OFF表示数据放在系统共享表空间;值为ON表示每个表存储在.idb文件
    3.delete命令删除逻辑:某条记录的位置或数据页标记为可复用,但磁盘文件不会减少。

重建表(自动生成临时表,完成数据转换,交换表名)

  1. 命令:alter table A engine=InnoDB
  2. 只有5.6以后这个操作的DDL才是Online,即在操作过程中运行数据增删改

主从

分区

一张表如果进行分区,则包含一个.frm文件和n个(分区个数).idb文件。对于server层来说是一张表,对于引擎层来说是n张表 锁表时按照分区表(部分数据)锁,而不是锁原表(全部数据)

分区表所有分区共享一个MDL锁(因为在server层看来,这是一张表)
分区方式:range、hash、list等 分区字段必须包含在主键,因此主键可以使用联合索引
优点:

  1. 对业务透明,代码更简单
  2. 方便清理历史数据
  3. 对业务透明,代码更简单
  4. 方便清理历史数据

缺点:

  1. 第一次访问需要打开所有分区
  2. 公用了MDL锁

用户和权限

创建一个用户(MySQL以 【用户名@ip】 作为一个用户)

CREATE USER 'userA'@'%' identified BY 'password'

MySQL对用户和权限的操作,会被拆分为以下操作

  1. 增删改 mysql.user表
  2. 增删改 内存中的数组scl_users
    flush privileges 命令会清空 acl_users 数组