mysql 也是一个常见的数据库系统,一条sql 从写好到执行,要经历几个阶段,就像你去办一个营业执照 ,先提交材料--》 初步审核--》缴费--》审核2---》发证
一条sql 进入数据库执行,需要经历一下步骤:
连接器(权限校验) --》分析器(词法分析)--》优化器(执行计划,选择索引) --》执行器 --》 存储引擎(innodb)
门口保安 --》大厅向导服务人员 ----》 科员帮你填材料 -------------》审批 -----》办事发执照
- 连接器:
show processlist 可以查看链接信息, Command 显示连接状态 sleep 代表此连接空闲
- 分析器
语法分析,判断是否有那些字段,是否符合mysql 的语法,是否存在mysql关键字 例如你将select 写成 sele ,或者少些 from字段 ,这个阶段mysql 就会给你返回错误信息,避免继续执行
select * user where ID=1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select * user where ID=1' at line 1
- 优化器
优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。
- 执行器
开始执行的时候,要先判断一下你对这个表 user_xxx 有没有执行查询的权限,如果没有,就会返回没有权限的错误
- 存储引擎
mysql的执行Write-Ahead Logging,它的关键点就是先写日志,再写磁盘
例如innodb 需要更新一条数据库记录的时候,先把记录写道redo log中,马上更新内存,这个时候算更新完成了,在后续系统不忙的时候,
InnoDB 将这个操作记录更新到磁盘里面
当然redo log 是可以配置大小的,比如配置 2个 1g的文件 当记录写道靠近checkpoint的时候 ,checkpoint 擦除记录前要把记录更新到数据文件。
redo log 是 InnoDB 引擎特有的日志redo log(重做日志): redo log 记录的是“在某个数据页上做了什么修改”;redo log 是循环写的,空间固定会用完;
mysql 的所有存储引擎都有binlog(归档日志)。 binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 id=111111 这一行的 score 字段加 1 ”,binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志
当然binlog 有一个优点是 redolog无法替代的 :redolog是循环写的,不持久保存,binlog的“归档”这个功能,redolog是不具备的。
数据库的事务:
一定要保证事务的原子性,不可分割
隔离性
一致性
持久性 一旦提交 数据库中的数据的改变就是永久性