作为一位开发人员,必然要和mysql打交道,平常肯定也写各种各样的sql语句,下面咱们先来看一个非常简单的sql语句
select * from order where id = 10;
我们看到这个sql,都会说,很简单的一个查询语句,执行结果是查询order表中id=10的所有数据,但是大家知道这个sql在Mysql内部是如何执行的吗?接下来,我就把一一给大家进行讲解,mysql的执行过程
mysql整体分为两层:Server层和存储引擎层
其中Server层包括连接器、分析器、优化器、执行器等,包含了Mysql的大多数核心功能,以及所有的内置函数(比如日期,时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等
而存储引擎层负责数据的存储和提取。存储引擎包括InnoDB、MyISAM等,目前最常用的存储引擎是InnoDB,在Mysql5.5.5.版本开始InnoDB就是默认存储引擎了
第一步,需要先连接到数据库上,这时候就是连接器在发挥作用,连接器负责跟客户端创建连接,获取权限、维持和管理连接。
连接数据的命令如下
mysql -h host -P port -u username -p password
输入完命令后,会出现交互式对话,让你输入密码,然后mysql客户端就会和mysql服务端建立连接,然后验证身份
这也意味着如果这是修改了当前用户的权限,也不会影响之前已经连接成功的用户,只有连接中断,再重新连接才会生效。
mysql默认的连接超时时间为8小时,修改默认值可以通过wait_timeout参数。
因为每次数据库创建连接都比较好资源,所以建议使用长连接来保持数据库连接
名词解释:
长连接:创建一次连接,后面的请求都使用同一个连接,不会创建新连接
短连接:每次请求都会创建一个新的连接
使用长连接存在的问题:当过多用户访问数据库的时候,会导致内存膨胀,最终产生OOM,让mysql宕机
解决方案:
执行sql语句会先走缓存,如果命中缓存,就直接返回结果,如果没有命中缓存,则继续往下执行
由于在mysql8.0之后查询缓存模块已经被删除,咱们也就不详细讲解这一块了
如果没有命中缓存,就会走到分析器,分析器主要分为词法分析和语法分析。
分析器会先做词法分析。根据你输入的sql语句,进行关键词匹配语句类型,比如是查询、删除、修改还是新增语句,识别数据库表是否存,字段是否存在。
完成上面单词识别后,就会进行语法分析,会分析你的语法是否符合sql的规范,如果你的语句不对,就会收到”You have an error in your SQL syntax“的错误提示比如下面的语句from少打了一个f
select * orm t where id = 10
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 * orm t where id = 10' at line 1
一般错误都在use near附近
经过分析器之后,mysql就知道你要做什么了,但是在具体执行之前,还会针对你的sql语句进行优化
优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。
比如:
select * from t1 join t2 using(id) where t1.c=10 and t2.d=20
上面两种执行方法最终的结果是一样的,但是执行效率确不相同,优化器的作用就是决定使用哪一种执行方法。
优化器执行完成后,语句的执行就具体确定下来了,然后就会进入到执行器阶段了
mysql通过分析器知道了你要做什么,通过优化器知道了该怎么做,执行器就负责通过存储引擎执行sql了
比如:
select * from order where id = 10
首先验证是否存在有查询的权限,如果没有权限,则报错SELECT command denied to user 'b'@'localhost' for table 'order'
如果有权限,则会查找order表中所有id=10的数据
本篇主要讲解了mysql的组成架构,和sql语句执行需要经过哪些阶段,希望可以通过本篇可以让你简单了解,一个sql语句的执行流程是什么样子的,后面的篇章会根据每个流程进行展开细聊,希望对你有所帮助,感谢您的阅读