一、mysql如何执行一条sql语句?
① 与mysql建立通信协议,并且确定用户的权限。
② 查询mysql的缓存,mysql8.0直接删除了缓存,命中缓存需要sql语句完成一致,并且表数据一致(数据更新会立马清空缓存)。
③ 解析器,语法解析,解析sql语句的语法,预处理,检查校验数据的正确性。
④ 查询优化器,根据解析树生成查询计划。详见 :https://blog.csdn.net/qq_16803227/article/details/106479505
1> 主要是根据cpu成本和io成本选取最优索引。
2> 优化连接查询主要是 inner join,会根据决定连接表的顺序。
⑤ 执行器,MySQL 通过分析器知道了你要做什么,通过优化器知道了该怎么做,得到了一个查询计划。于是就进入了执行器阶段,开始执行语句。
1>开始执行的时候,要先判断一下你对这个表customer有没有执行查询的权限,如果没有,就会 返回没有权限的错误。 (在工程实现上,如果命中查询缓存,会在查询缓存返回结果的时候,做权限验证)
2>如果有权限,就使用指定的存储引擎打开表开始查询。执行器会根据表的引擎定义,去使用这 个引擎提供的查询接口,提取数据。
二 mysql 的磁盘文件 MySQL在Linux中的数据索引文件和日志文件一般默认都在/var/lib/mysql目录下。
① 错误日志(errorlog)默认的错误日志名称:hostname.err。
② 二进制日志(bin log) 默认是关闭的。
③ 慢查询日志(slow query log)
④ 重做日志文件(redolog)回滚日志(undo log)详见:https://blog.csdn.net/qq_16803227/article/details/106627133
⑤ 表结构文件: frm文件存储的是表的结构,ibd文件存储的是表的数据,存储引擎负责对表中数据的读取和写入,每个存储引擎会以自己的方式来保存表中的数据,在不同存储 引擎中数据存放的方式一般是不同的。 MySQL的数据文件存放在位置,可以通过参数datadir控制SHOW VARIABLES LIKE ‘%datadir%’;。 查看MySQL数据文件: InnoDB数据文件 ibd文件,使用独享表空间存储表数据和索引信息,一张表对应一个ibd文件。
三、MySQL的索引结构,详见 :https://blog.csdn.net/qq_16803227/article/details/104932442,索引优化详见:https://blog.csdn.net/qq_16803227/article/details/106479505