数据库的结构分为:大体分为两个部分:client、server;
server包括:连接器、缓存、优化器、执行器;
以及存储引擎;
如图:
mysql分为长连接和短连接,长连接连接成功后,如果客户端有请求一直会是同一个连接,短连接是执行多次查询之后会断开,重新再次连接,默认时间是8h,可以使用参数wait_timeout配置。
定期断开长连接,使用一段时间之后,或者在一个大的查询执行之后,断开重新,之后查询重新链接
如果使用的mysql5.7以及以上,可以使用mysql_restart_connection来初始化链接资源,其中是不需要重新链接和权限的验证
这里说明一下,用户连接之后,管理员再次更改用户的权限的时候,是不影响已经获取的权限的用户,仅仅在重新链接之后才会起作用
语法分析是指当你的的sql语句是够符合sql的规范,如下面使用下面语句
mysql> elect * from depart;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 'elect * from depart' at line 1
由于你少打了一个s,就会保存提示You have an error in your SQL syntax;
select * from A a inner join B b on a.id=b.bid where a.name='jiepi' b.age=12
上面语句到底是查询A表的name还是B表的age,他们的执行效率是不一样的。
一条语句的执行,在判断查询的表是否有权限,如果没有返回报错,如果有权限直接打开表,然后根据表的引擎定义,使用引擎的查询接。
select * from T where ID=10;
如上图,他的执行流程如下
调用InnoDB引擎接口取第一行,如果是就放到结果集中,否则继续第二行
调用存储引擎的接口,重复执行,直到最后一行
最后把符合的结果返回给客户端
你在查询慢日志的时候会发现有一个rows_examined的字段,他就代表的执行器扫描的行数,但是有些场景执行器调用一次,存储引擎内部会扫描多行,因此引擎扫描行和rows_examined是不一样的。
缓存的使用在某些场景还是可以使用的,比如一些系统配置变量,我们也可以使用SQL_CACHE显示指定查询缓存,也可以使用参数query_cache_type设置成DEMAND,禁止使用缓存
select SQL_CACHE * from dpet;
mysql 查看sql hash,执行sql语句_Mysql进阶篇--sql语句如何执行