mysql实战笔记

笔记来源于mysql实战,却高于它

查询语句执行流程

  • MySQL可以分为Server层和存储引擎层两部分。
  • Server层:所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
  • 而存储引擎层负责数据的存储和提取。支持InnoDB、MyISAM、Memory等多个存储引擎。InnoDB从MySQL 5.5.5版本开始成为了默认存储引擎。
  • 不同的存储引擎共用一个Server层,也就是从连接器到执行器的部分。你可以先对每个组件的名字有个印象,接下来我会结合开头提到的那条SQL语句,带你走一遍整个执行流程,依次看下每个组件的作用。

 连接器:负责跟客户端建立连接、获取权限、维持和管理连接

 客户端连接超时由wait_timeout控制的,默认值是8小时。

修改命令

 SHOW GLOBAL VARIABLES LIKE 'wait_timeout';
 SET GLOBAL wait_timeout=28800;

由该长连接造成内存占用过多解决方案:

  1. 定期断开长连接。使用一段时间,或者程序里面判断执行过一个占用内存的大查询后,断开连接,之后要查询再重连。

  2. MySQL 5.7以上版本,通过执行 mysql_reset_connection来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。

查询缓存:以key-value对的形式,被直接缓存在内存中。key是查询的语句,value是查询的结果

多数情况不要使用,表更新,缓存清空然后又存进来。很少更新的静态表和动态表可以使用

静态表:字段有固定长

动态表:字段不定长

用缓存查询,不用缓存就写SQL_NO_CACHE

SELECT SQL_CACHE * FROM 表; 

windows的my.ini设置缓存类型. 0 for OFF, 1 for ON and 2 for DEMAND.

query_cache_type=2

查询缓存类型

SELECT @@query_cache_type;

SHOW VARIABLES LIKE '%query_cache%';

SHOW GLOBAL  STATUS LIKE '%Qcache%';

  • Qcache_free_blocks:表示查询缓存中目前还有多少剩余的blocks,如果该值显示较大,说明查询缓存中的内存碎片过多。
  • Qcache_free_memory:表示Query Cache中目前剩余的内存大小。
  • Qcache_hits:表示有多少次命中缓存。
  • Qcache_inserts:表示多少次未命中缓存然后插入,意思是新来的SQL请求如果在缓存中未找到,不得不执行查询处理,执行查询处理后把结果insert到查询缓存中。
  • Qcache_lowmem_prunes:该参数记录有多少条查询因为内存不足而被移出查询缓存。
  • Qcache_not_cached: 表示因为query_cache_type的设置而没有被缓存的查询数量。
  • Qcache_queries_in_cache:当前缓存中缓存的查询数量。
  • Qcache_total_blocks:当前缓存的block数量。
flush query cache; – 整理,不删除缓存数据
reset query cache ; – 可删除缓存内容

备注:从MySQL 8.0版本以后直接取消了查询缓存的整块功能。

分析器:MySQL需要识别出里面的字符串分别是什么,代表什么

它也要把字符串“T”识别成“表名T”,把字符串“ID”识别成“列ID”。

词法分析的结果,语法分析器会根据语法规则,判断你输入的这个SQL语句是否满足MySQL语法

优化器:优化器是在表里面有多个索引的时候,决定使用哪个索引

执行器:调用InnoDB引擎接口取这个表的各行,重复相同的判断,如果不是则跳过,如果是则将这行存在结果集中;

慢查询日志中看到一个rows_examined的字段,表示这个语句执行过程中扫描了多少行。在有些场景下,执行器调用一次,在引擎内部则扫描了多行,因此引擎扫描行数跟rows_examined并不是完全相同的。

猜你喜欢

转载自www.cnblogs.com/tk55/p/13182299.html