目录
假设我们执行一条sql语句如下:
select * from t_good where good_id = '1'
首先我们会和mysql建立连接,此时就会执行到连接器。
连接器的职责是负责和客户端建立连接、获取权限、维持和管理连接。
我们执行sql之前首先要和数据库建立连接。建立连接时如果我们的用户名和密码不正确,那么就会收到“"Access denied for user”的错误提示。
建立连接后,我们输入的sql传给mysql。mysql的分析器就开始对这条sql进行分析。
分析器包括词法分析和语法分析。
词法分析:根据输入的sql,识别出来这条sql是由什么字符串组成的,例如上边sql是由select 、from 、t_good等组成,通过词法分析可知这是一条查询语句。
语法分析:词法分析之后,语法分析器就会根据语法规则,判断这条sql是否符合语法。如果不符合语法就会给出相应的提示。
提示如下:
这条语句我们把from写成了form,所以给了语法错误的提示信息。
优化器要做的事情是:决定这条查询语句如何执行。
例如:订单表中有多个索引,查询语句应该使用哪个索引进行查询。或者t1表联合t2表查询,到底先查询t1表的内容还是先查询出t2表中的内容呢?
而最终决定使用哪个索引或者哪种查询顺序是根据计算出来的cost来决定。
优化器决定了sql到底该如何执行,执行器就是负责按优化器的决定结果进行执行的。
查询缓存在mysql8.0版本已经去掉,此处并未提及。
查询缓存的原理:将已经执行过的语句及结果以key-value的形式进行存储,在分析器执行之前先查询是否有这个语句的缓存,如果有,那么执行返回结果。
查询缓存的实际效果:在实际的业务中我们的查询语句往往是动态,例如列表的多条查询,这会导致这个查询缓存的命中率很低。所以在生产环境不建议使用查询缓存。