MySQL实战45讲学习笔记---基础架构
今天开始把《MySQL实战45讲》的知识做一笔记,在加深印象的同时,希望对其它人也有所帮助。
大体来说,Mysql可分为Server层和存储引擎层两大部分,如图:
其中,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来控制,如图:
数据库里面,长连接是指连接成功后,如果客户端持续有请求,则一直使用同一个连接,短连接是指每次执行完很少的几次查询就断开连接,下次查询再重新建产一个,由于建产连接的过程是比较复杂的,所以建议尽量使用长连接。
但全部使用长连接之后,你可能会发现,有些时候Mysql占用内存涨得特别快,这是因为Mysql在执行过程中临时使用的内存是管理在连接对象里面的。这些资源会连接断开时才释放。所以如果长连接累积下来,可能导致内存点用太大,被系统强行杀掉(OOM),从现在看就是Mysql异常重启了。
解决这个问题有两种方案:
- 定期断开长连接。
- 如果你用的是Mysql5.7或更新的版本,可以在每次执行一个比较大的操作后,执行mysql_reset_connection来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建时的状态。
- 查询缓存
建立连接后,你就可以执行select语句了,mysql收到查询请求后,会在查询缓存中看之前是不是执行过这条语句。之前执行的语句及结果可能会以key-value的形式被直接缓存在内存中,key是查询的语句,value是查询的结果。如果查询语句能在缓存中直接找到key,那么就把这个value直接返回给客户端。
但在大多数情况下,不建议使用查询缓存,因为查询缓存失效非常频繁,只要有对一个表的更新,这个表上的所有查询缓存都会被清空。你可以将参数query_cache_type设置成DEMAND。
- query_cache_type=OFF 关闭查询缓存
- query_cache_type=ON,开启查询缓存,缓存所有结果,除非select语句使用SQL_NO_CACHE禁用查询缓存
- 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,如果不是则跳过,如果是则将这行存在结果集中。重复这样的操作,直到取到这个表的最后一行。执行器将遍历过程中所有满足条件的行组成的记录集返回给客户端。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341