MySQL实战45讲学习笔记---基础架构

    今天开始把《MySQL实战45讲》的知识作一笔记,在加深印象的同时,但愿对其它人也有所帮助。mysql

   大致来讲,Mysql可分为Server层和存储引擎层两大部分,如图:sql

 其中,Serve层包括链接器、查询缓存、分析器、优化器、执行器以及全部的内置函数(如:日期时间函数等);存储引擎层负责数据的存储和提取,支持InnoDB、MyISAM等多个存储引擎。如今学用的就是InnoDB,从Mysql 5.5.5版本开始InnoDB成为了默认的存储引擎。数据库

  • 链接器

链接器负责跟客户端创建链接、获取权限、维持和管理链接。链接命令通常这么写:缓存

mysql -h$ip -P${port} -u${username} -p

输入上面命令,再根据提示你输入密码后就能够链接上Mysql了。咱们能够在mysql里面执行如下命令查看链接函数

show processlist

如图:优化

可看出如今有两个Mysql链接,每个链接Command栏显示为“Sleep”,Time显示60,表示这个链接处理空闲状态,已经空闲了60秒,若是客户端长时间没有动静,链接器就会自动将它断开,这个时间默认是8小时,由参数 wait_timeout来控制,如图:code

   数据库里面,长链接是指链接成功后,若是客户端持续有请求,则一直使用同一个链接,短链接是指每次执行完不多的几回查询就断开链接,下次查询再从新建产一个,因为建产链接的过程是比较复杂的,因此建议尽可能使用长链接。对象

  但所有使用长链接以后,你可能会发现,有些时候Mysql占用内存涨得特别快,这是由于Mysql在执行过程当中临时使用的内存是管理在链接对象里面的。这些资源会链接断开时才释放。因此若是长链接累积下来,可能致使内存点用太大,被系统强行杀掉(OOM),从如今看就是Mysql异常重启了。blog

  解决这个问题有两种方案:索引

  1. 按期断开长链接。
  2. 若是你用的是Mysql5.7或更新的版本,能够在每次执行一个比较大的操做后,执行mysql_reset_connection来从新初始化链接资源。这个过程不须要重连和从新作权限验证,可是会将链接恢复到刚刚建立时的状态。

 

  • 查询缓存

  创建链接后,你就能够执行select语句了,mysql收到查询请求后,会在查询缓存中看以前是否是执行过这条语句。以前执行的语句及结果可能会以key-value的形式被直接缓存在内存中,key是查询的语句,value是查询的结果。若是查询语句能在缓存中直接找到key,那么就把这个value直接返回给客户端。

  但在大多数状况下,不建议使用查询缓存,由于查询缓存失效很是频繁,只要有对一个表的更新,这个表上的全部查询缓存都会被清空。你能够将参数query_cache_type设置成DEMAND。

  1. query_cache_type=OFF 关闭查询缓存
  2. query_cache_type=ON,开启查询缓存,缓存全部结果,除非select语句使用SQL_NO_CACHE禁用查询缓存
  3. query_cache_type=DEMAND,只缓存select语句中经过SQL_CACHE指定须要缓存的查询

这样对于默认的SQL都不使用查询缓存,对于你确认要使用查询缓存的语名,能够用SQL_CACHE显示指定如:

select SQL_CACHE * from T where id=1;

注意:Mysql8.0版本直接将查询缓存的整个功能都删除了,完全没有这个功能了。

  • 分析器

分析器会先对SQL语句作词法分析与语法的分析,若是SQL语句不对,就会收到"You have an error in your SQL syntax"的错误提醒。

  • 优化器

优化器是在表里面有多个索引的时候,决定使用哪一个索引或者是在一个语句有多个关联(join)的时候,决定各个表的链接顺序。

  • 执行器
select * from T where id=1;

执行器的流程以下:

调用InnoDB引擎接口取这个表的第一行,判断ID是否是1,若是不是则跳过,若是是则将这行存在结果集中。重复这样的操做,直到取到这个表的最后一行。执行器将遍历过程当中全部知足条件的行组成的记录集返回给客户端。

相关文章
相关标签/搜索