1. MySQL整体分为两层,1.server层,2.存储引擎(InnoDB,Memory,MyISAM)等,默认使用InnoDB。
    image.png
  2. server层分为连接器,查询缓存,分析器,优化器,执行器。核心服务基本都在这层,不同存储引擎共用同一个server层。
  3. 使用时需要先链接,使用的协议是TCP,需要出入IP地址,端口,用户名和密码。
  4. 链接后长时间不使用该链接会处于Sleep状态,超时(wait_timeout)后会断开连接,默认8小时。
  5. 连接分为长连接和短连接;长连接是连接成功后如果一直有查询动作则一直不会断开;短连接是执行过几轮查询后会断开连接,再次使用需要重连。
  6. 连接过程复杂耗时,所以建议使用长连接。但长连接使用过多也会导致MySQL内存涨的比较块,这是因为在查询过程中临时使用的内存会管理在连接对象中,这样连接不中断内存不释放。严重时会导致MySQL内存占用量过高而被系统强制杀掉,这样就会出现MySQL异常重启。
  7. 为了避免这个问题可以:

    1. 定期断开长连接。使用一段时间,或者程序里面判断执行过一个占用内存的大查询后,断开连接,之后要查询再重连.
    2. 如果你用的是 MySQL 5.7 或更新版本,可以在每次执行一个比较大的操作后,通过执行 mysql_reset_connection 来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态
  8. 查询缓存就是在连接建立后的查询操作的第一步,如果命中缓存就直接返回结果结束查询,看似会提高查询效率。
  9. 但是大多数情况下我会建议你不要使用查询缓存,为什么呢?因为查询缓存往往弊大于利。
  10. 查询缓存变更频繁,只要对表进行更新,那表中的查询缓存全部清空。好在 MySQL 也提供了这种“按需使用”的方式,你可以将参数 query_cache_type 设置成 DEMAND,这样对于默认的 SQL 语句都不使用查询缓存。而对于你确定要使用查询缓存的语句,可以用 SQL_CACHE 显式指定,像下面这个语句一样

    mysql> select SQL_CACHE * from T where ID=10;
  11. 解析器,识别sql语法,主要做词法分析和语法分析。
  12. 优化器,在解析器执行完成后引擎就能理解用户的行为了,但很多行为逻辑结果一致但因为中间执行顺序不同而执行效率也不同。如:优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。优化器的作用就是决定执行顺序,保证执行效率。
  13. 执行器,根据优化后的语句调用存储引擎的接口,将执行结果收集并返回给客户端。
  14. 注意一点,表名是否存在,表中列是否存在等判断都是在解析器阶段进行判断的。

牛刀杀鸡
3 声望0 粉丝