来源
数据库基础
语句定义
- 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存只记录操作逻辑,而不会判断是否真的完成,重启后也无法判断哪些操作是否完成。
两种日志区别:
- redo log是InnoDB独有的,binlog是Sever层日志,任何存储引擎都能使用
- redo log是物理日志,记录“在某个数据页做了什么改动”;而binlog是逻辑日志,记录SQL语句的原始逻辑
- redo log是循环写(固定空间),写满之后需要写数据磁盘;而binlog是追加写,写满之后换一个文件,不会覆盖。
两阶段提交: 保证redo log 和 binlog 保存的逻辑是一致的(保证一致性)。 顺序:写redo log,然后处于preview阶段 -> 写binlog -> commit redo log
表底层存储
- 表结构:在8.0版本以前单独存储在.frm文件,80之后运行存在系统数据表
- 表数据:通过参数
innodb_file_per_table控制,值为OFF表示数据放在系统共享表空间;值为ON表示每个表存储在.idb文件
3.delete命令删除逻辑:某条记录的位置或数据页标记为可复用,但磁盘文件不会减少。
重建表(自动生成临时表,完成数据转换,交换表名)
- 命令:alter table A engine=InnoDB
- 只有5.6以后这个操作的DDL才是Online,即在操作过程中运行数据增删改
主从
分区
一张表如果进行分区,则包含一个.frm文件和n个(分区个数).idb文件。对于server层来说是一张表,对于引擎层来说是n张表 锁表时按照分区表(部分数据)锁,而不是锁原表(全部数据)
分区表所有分区共享一个MDL锁(因为在server层看来,这是一张表)
分区方式:range、hash、list等
分区字段必须包含在主键,因此主键可以使用联合索引
优点:
- 对业务透明,代码更简单
- 方便清理历史数据
- 对业务透明,代码更简单
- 方便清理历史数据
缺点:
- 第一次访问需要打开所有分区
- 公用了MDL锁
用户和权限
创建一个用户(MySQL以 【用户名@ip】 作为一个用户)
CREATE USER 'userA'@'%' identified BY 'password'
MySQL对用户和权限的操作,会被拆分为以下操作
- 增删改 mysql.user表
- 增删改 内存中的数组scl_users
flush privileges 命令会清空 acl_users 数组