MySQL逻辑结构和查询过程

一条SQL查询语句的执行流程

  • Server层动作:
    1、连接数据库,通过连接器:进行权限验证,验证成功后这个连接里的权限判断逻辑都依赖于此时读到的权限。
      连接后若无后续动作,连接就处于空闲状态,连接器会自动断开长时间没操作的客户端,由参数wait_timeout控制,默认是8小时。
    2、查询缓存,如果查询语句不存在查询缓存中,继续后面的执行阶段,执行完成后结果会被存入查询缓存。如果命中查询缓存,就可以直接返回结果。
    3、分析器:词法分析,语法分析。
    4、优化器:索引的选择,多表关联的顺序。
    5、执行器:先做用户对表权限验证。调用引擎层接口,逐行取到所有满足条件的行记录,组成记录集作为结果返回给客户端。
  • 引擎层动作:
    为Server层提供引擎接口。

各阶段存在的问题

  • 连接器:使用长连接时,MySQL可能占用内存太大,导致异常重启,如何解决?
      先说一下为什么长连接占用内存,MySQL执行过程中临时使用的内存管理是在连接对象里面的。这些资源会在连接断开时才释放。所以长时间使用长连接会导致内存占用过大,被系统OOM(Out Of Memory),体现为MySQL异常重启了。
      1、定期断开场链接。
      2、MySQL5.7以后,可在每次执行一个比较大的操作后,执行mysql_reset_connection重新初始化连接资源。此过程不需要重连和重新做权限验证,但会将连接恢复到刚创建完成时的状态。
  • 查询缓存:只要表有更新操作,该表上的所有查询缓存都会被清空,如何合理使用查询缓存?
      1、当数据库中表都是静态表,很久更新一次时,可以开启查询缓存。
      2、将参数query_cache_type设置为DEMAND,使默认的SQL语句都不使用查询缓存;通过SQL_CACHE显示指定需要产生查询缓存的SQL语句,如select SQL_CACHE * from T where id=1;

你可能感兴趣的:(MySQL逻辑结构和查询过程)