MySQL笔记

MySQL笔记(-):查询SQL的执行过程

MySQL逻辑架构图

连接器

  连接器用于与客户端建立一条半双工的链接,半双工意味着在同一时刻服务器和客户端两者之间只能有一方发送另一方接收.使用mysql -hlocalhost -uroot -p命令可以建立一条链接,通过show full processlist命令可以查看当前所有的链接.如下图:
当前与链接器建立的所有链接
  其中Sleep表示该链接正在空闲状态,Query表示该链接正在进行查询操作.一条链接如果太长时间处于空闲状态,则连接器会主动将其断开,这个时间由wait_timeout参数控制,默认是8小时,该参数指定的是连接建立成功后处于空闲状态的时间。客户端连接成功后同时会去权限表读取用户权限,并检查该用户是否有操作权限。
   MySQL还定义了interactive_timeout参数,该参数与wait_timeout不同就是wait_timeout定义的是非交互式连接的空闲时间,而interactive_timeout定义的是交互式连接的空闲时间,至于什么是交互式/非交互式连接,只需要明白一点我们平常使用数据库连接池或者使用JDBC方式访问数据库的都是非交互式连接,而如果你使用mysql的窗口程序访问数据库的方式是交互式连接,这两个值默认都是8小时,如果要修改,最好保持这两个值一样。
  另外,mysql还有一个参数是connect_timeout,这个参数指示的是客户端在尝试与数据库服务器建立连接时等待服务器响应的时间,默认是10s,如果10s后服务器没有响应则不再尝试连接。

查询缓存

  查询缓存是用来存储我们之前运行过的查询语句以及其对应结果集的映射关系,MySQL将查询的SQL语句、客户端协议、字符集等作为KEY,其结果集作为VALUE存储到一块指定的内存区域中,因此如果要命中查询缓存,则必须保证SQL语句,客户端协议,字符集等一些限制条件都一样才行.
通过show variables like ‘%query_cache%’;命令可以得到查询缓存的相关参数.如下图:

1.query_cache_limit:表示单条缓存结果集的最大空间,默认为1048576字节,即1M,单条结果集如果超过1M则不会缓存.
2.query_cache_min_res_unit:为每个缓存分配内存块的最小单元,即使数据集大小未达到指定的大小,也会申请这么大的内存,默认4K.
3.query_cache_size:所有缓存占用的总空间大小,必须是1024的整数倍.
4.query_cahce_type:缓存类型,同时控制是否开启查询缓存
可选项
a、0(OFF):关闭查询缓存功能,任何情况下都不会使用查询缓存,如果把query_cache_size设置为0也可以将查询缓存关闭,但是如果要关闭查询缓存,还是建议使用query_cache_type=0的方式,因为这样会减少不必要的代码逻辑。
b、1(ON):开启查询缓存功能,但是当SELECT语句中使用SQL_NO_CACHE提示后,将不使用查询缓存;
c、2(DEMAND):开启查询缓存功能,但是只有当SELECT语句中使用了SQL_CACHE 提示后,才使用查询缓存

我们可以通过一些STATUS参数查看缓存的使用状态

  1. Qcache_free_blocks: 缓存池中空闲块的个数
  2. Qcache_free_memory: 缓存中空闲内存量
  3. Qcache_free_memory: 缓存中空闲内存量
  4. Qcache_hits: 缓存命中次数
  5. Qcache_inserts: 缓存写入次数
  6. Qcache_lowmen_prunes: 因内存不足删除缓存次数
  7. Qcache_not_cached: 查询未被缓存次数,例如查询结果超出缓存块大小,查询中包含可变函数等
  8. Qcache_queries_in_cache: 当前缓存中缓存的SQL数量
  9. Qcache_total_blocks: 缓存总block数
  10. Qcache_free_memory: 缓存中空闲内存量
    例如:show status like ‘%Qcache_hits%’;

缓存的失效时机
  在对表的结构进行修改,如ALERT TABLE、DROP TABLE等,还有对表的任何增删改操作都会导致缓存实效。因此,查询缓存并不建议开启,尤其是那些需要经常更新的表来说,每次更新都会把缓存清空,然后在下一次查询的时候再存储一次缓存,对性能损耗比较严重。建议将query_cache_type设置为DEMAND,在希望用到缓存的时候添加SQL_CACHE参数。

分析器

  分析器的功能主要包括(1)语法检查,如果SQL语句有不符合规则的部分会直接提示You have an error in your SQL syntax。(2)语义解析(3)检查数据表和数据列是否存在

优化器

  优化器主要对分析器过来的语句进行进一步的优化,比如使用哪个索引,对于join操作应该先查询那张表等。

执行器

  执行器会直接调用具体的数据库引擎,例如InnoDB、MyISAM引擎等的API接口执行具体的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值