一、一条建表语句是如何执行的?
Step1:连接器:mysql -uroot -p走 TCP 三次握手->查 mysql.user 表验证账号密码
Step2:查询缓存(8.0 已废弃):key=SQL 原文哈希,value=结果集,只要表上有任何 UPDATE/INSERT 就全部 invalidate,命中率极低,8.0 模块已经删除。
Step3:解析器 Parser:词法分析(把 SELECT/id/=切 token)+ 语法分析(按 SQL 语法规则 buildAST 抽象语法树,语法报错会在这一步报 You have an error in your SQL syntax)
Step4:预处理器:检查 AST 里引用的库/表/列是否存在、权限是否够
Step5:优化器 Optimizer:生成多个执行计划、选代价最低的(代价=IO cost+CPU cost,默认 IO cost 权重=1,CPU cost 权重=0.2,SHOW STATUS 看 Last_query_cost)
Step6:执行器 Executor:循环调用存储引擎的接口index_read()/index_next()/read_record()取行
Step7:把结果集写 Net Buffer->发 TCP 给客户端
create table db.test(
String name,
int age
);
首先,数据库会默认执行 begin 语句,新建一个事务。
循环每一列,如果是索引列,就建 B+ 树
如果建表失败就回滚,否则就提交
