接上文,上文简述到了Mysql中的查询缓存和解析器,今日我们继续。
先来看一段SQL:SELECT * FROM `jianghuadong`;
先假设我们数据库中并没有一张名为jianghuadong的表,那么这句语句的执行结果是?
首先,这句SQL肯定格式上是没有任何问题的,问题在于查询的表不存在。也就是你的SQL从语义上存在问题。
预处理器
根据以上情况,预处理器会确保欲执行的SQL从语义上没有错误,比如:表名,别名,权限等几个方面去确保SQL正确。
别名错误举例:SELECT b FROM `jianghuadong` as a;
权限就是比如你的当前账号只有SELECT权限,但是你打算执行一条UPDATE语句,那么预处理器会阻止你干这件蠢事。
至此,我们的图在增加一个模块:
优化器
思考一个问题,给出一条SQL语句:SELECT * FROM `member_info` WHERE age > 21 and sex = 1;
这条SQL语句由客户端发送到Mysql Server ,是否Server在真正执行的时候,一定就是这条语句?
实际上,Mysql Server在执行之前,会有一个叫做优化器的组件,对你的SQL进行优化重组,列出尽可能多的语句,然后选择优化器认为最优(基于成本)的一条进行执行,但是返回的结果
肯定是与你发送给Mysql Server的执行结果是一致的。
不只是Mysql,市面上的数据库基本都包含优化器模块。
优化器最主要的作用是优化,比如当你需要联合查询的时候,SELECT a from a join b ...; 这个时候,到底是先查询a表还是b表,是由优化器决定的。
其次,优化器还决定了索引的选择,当一张表存在多个索引的时候,查询时使用哪个索引,也是由优化器决定。
当你的SQL经过优化器进行了一系列的优化后,会生成一个叫做执行计划的数据结构,到底先查询哪张表,使用哪个索引。
实际上,这个执行计划我们是可以查看的,在SQL语句前加入 EXPLAIN 命令,举例说明:
查询member_info表,可以看到结果中有很多列,包含预计使用索引,实际使用索引等等,这些列的含义我们后面会详细说明,此处只是简单介绍执行计划的作用。
如果你是5.7以上版本,可以添加上FORMAT=JSON执行:EXPLAIN FORMAT=JSON SELECT * FROM member_info; 查看更加详细的信息。
思考一个问题:我们在Mysql上的数据,到底是放在哪里?
从我们的角度,或者逻辑上来说,是放在表中,也可以说是文件。
存储引擎
存储引擎是Mysql中比较重要的一环,内容较多,我们另开一章专门聊聊存储引擎。