Mysql构成:server 层和存储引擎两部分
(1)Server 层:连接器,查询缓存,分析器,优化器,执行器
(2)存储引擎: innodb, menmory(使用内存引擎创建表), myisam
存储引擎
存储引擎主要是插件式的,主要用于数据的存储和提取。因此可能一个server层对应多个存储引擎。
在创建表时默认使用的存储引擎innodb,也可以使用engine=存储引擎指定特定的存储引擎存储数据。
Server 层:
连接器
与客户端建立连接,获取登录用户的权限
与MySQL获取连接的命令: mysql -h ip地址 -p 端口号(默认3306) -u 用户名 -p 密码用户名密码不对时:access denied for user
认证通过: 从权限表中查询出用户的权限,此后连接里面的权限逻辑判断依赖于此时查询出的权限。
查看连接状态: show procelist
显示与数据建立的各个连接的状态,如果一个连接的command列是sleep状态,说明此连接是空闲状态的。客户端连接长时间处于空闲状态,连接器会字段将其断开(等待时间通过参数 wait_timeout确定的)
数据库长连接:用户与数据库建立连接后,客户端持续有请求,则一直使用同一个连接
(因为数据库连接建立是十分复杂的,需要减少建立连接的动作,需要使用长连接)
短连接:每次只执行几句简单的查询就断开连接,下次查询需要重新建立一个连接。
(注:使用长连接时,发现MySQL占用内存长得特别快,因为MySQL执行时使用的临时空间是建立在连接对象里面的,长期累计会导致内存占用过大oom,
解决方法: 1 执行数据量大的操作后,断开连接
2 .MySQL 5.7 版本后 执行mysql_reset_connection 重新初始化连接资源)
缓存查询
MySQL8后没有查询缓存
建立连接后,可以执行查询逻辑,首先会执行查询缓存操作,MySQL拿到一个查询请求后,会先到查询缓存中查看是否执行过这个查询请求,执行结果以key-value格式存储,如果查询不到缓存,继续执行下面的查询操作。
(查询缓存:不建议使用,因为查询缓存失效特别频繁,当对表进行更新操作时,所有缓存都会被清空,因此查询的命中率会比较低
使用查询缓存可以使用按需缓存,设置参数query_cache_type = cemand 对于需要缓存的数据可以进行命令行显式指定:
mysql> select SQL_CACHE * from T where ID=10)
分析器
对输入的sql语句进行分析
1.取出操作的关键词select 判断操作,取出表名,列名,
2.进行语法分析判断sql 是否符合mysql语法规范
优化器
判断查询中使用哪个索引,在多表关联时,判断各个表的连接顺序
执行器
执行本次数据库操作
执行前,首先判断用户是否有对这个表的操作权限,(查询缓存后,返回结果前也会对权限进行判断),对数据逐行进行判断,在查询日志中rows_examined字段记录查询操作扫描了多少行。