ToB企服应用市场:ToB评测及商务社交产业平台

标题: MySQL底子架构 [打印本页]

作者: 王國慶    时间: 2024-7-25 17:06
标题: MySQL底子架构
MySQL底子架构

大要来说,MySQL可以分为 Server层 和 存储引擎层 两部门。


不同的存储引擎共用一个Server层,也就是从毗连器到执行器的部门。
一、毗连器 - 创建毗连,权限认证

   毗连器:负责跟客户端创建毗连、获取权限、维持和管理毗连。
  1. # 连接命令
  2. mysql -h 127.0.0.1 -P 3306 -u root -p
  3. # 本机登录(省略 -h ip -P port)
  4. mysql -u root -p
复制代码
密码也可以直接跟在-p背面写在命令行中,但这样大概会导致你的密码泄露,所以不发起。
   毗连命令中的 mysql 是客户端工具,用来跟服务端创建毗连。
  毗连服务包含 本地socket通讯 和 基于客户端/服务端工具实现的雷同TCP/IP的通讯。

该层引入了线程池的概念,为通过安全认证接入的客户端提供线程。
同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。
   在完成TCP握手后,毗连器开始进行认证:
  
这就意味着,一个用户成功创建毗连后,纵然修改了权限,也不会影响已经存在的毗连,只有重新毗连才会见效。
   毗连完成后,如果你没有后续的动作,这个毗连就处于空闲状态(Command列显示为Sleep)
  1. # 查看连接列表
  2. show processlist;
复制代码

   客户端如果太长时间没动静,毗连器就会自动将它断开。这个时间由参数wait_timeout控制,默认值是8小时
  
创建毗连的过程通常是比较复杂的,因此在使用中要尽量淘汰创建毗连的动作,也就是尽量使用长毗连
   全部使用长毗连后,你大概会发现,有些时间MySQL占用内存涨得特别快
  MySQL在执行过程中,暂时使用的内存是管理在毗连对象中的,这些资源在毗连断开的时间才会开释。所以如果长毗连累积下来,大概导致内存占用太大,被系统强行杀掉(OOM),从现象看就是MySQL异常重启了。
怎么解决这个问题呢?可以思量以下两种方案。

二、查缓存 - 提高效率

执行过的语句及其结果大概会以key-value的形式,被直接缓存在内存中。key是查询语句,value是查询结果。
  1. select * from T where ID=10;
复制代码
MySQL拿到一个查询哀求后,会先查询缓存,如果查询命中缓存就直接返回结果,否则继续执行背面的操作。
查询缓存的失效非常频仍,只要有对一个表的更新,这个表上全部的查询缓存都会被清空。因此:

可以将参数 query_cache_type 设置成 DEMAND,默认不查询缓存。也可以通过查询的时间手动指定,如下:
  1. # 查询缓存
  2. select SQL_CACHE * from T where ID=10;
  3. # 不查询缓存
  4. select SQL_NO_CACHE * from T where ID=10;
复制代码
注意:MySQL 8.0版本直接将查询缓存的整块功能删掉了,也就是说8.0开始彻底没有这个功能了。
三、分析器 - 做什么

如果没有命中缓存,就开始真正执行语句了。起首,MySQL需要知道你要做什么,因此需要对SQL语句做剖析。

四、优化器 - 怎么做

颠末了分析器,MySQL就知道你要做什么了。在开始执行之前,还要先颠末优化器的处置惩罚。

优化器阶段完成后,SQL语句的执行方案就确定下来了。
五、执行器 - 执行语句

进入执行器阶段,开始操作引擎,执行语句:

对于下面的语句,分析执行器的执行流程:
  1. select * from T where ID=10;
复制代码

对于有索引的表,执行的逻辑也差不多:

在数据库的慢查询日记中有一个rows_examined的字段

注意:rows_examined ≠ 引擎扫描行数(某些场景下,执行器调用一次,在引擎内部会扫描多行)
六、存储引擎

存储引擎层真正的负责了MySQL中数据的存储和提取,服务器通过API和存储引擎进行通讯。不同的存储引擎具有不同的功能,这样我们可以根据本身的需要,来选取合适的存储引擎。
1、存储引擎的概述

​ MySQL中的数据用各种不同的技术存储在文件或内存中,包括存储方式、索引技巧、锁定水平等不同功能。这些不同的技术以及配套的功能被称作存储引擎。
​ Oracle,SqlServer等数据库只有一种存储引擎。MySQL提供了插件式的存储引擎架构(多种存储引擎)。 所以MySQL可以根据需要使用相应引擎,或者编写存储引擎。
​ MySQL 常用的存储引擎有三种: InnoDB 、MyISAM 、MEMORY。创建表时如果不指定存储引擎,系统就会使用默认的存储引擎, MySQL5.5之前 默认是MyISAM,MySQL5.5之后就改为了InnoDB

2、存储引擎的对比

特点InnoDBMyISAMMEMORY存储限制64TB有有事务安全支持锁机制行锁,表锁表锁表锁外键支持BTree索引支持支持支持Hash索引支持全文索引支持(5.6版本后)支持集群索引支持数据索引支持支持索引缓存支持支持支持数据可压缩支持空间使用高低N/A内存使用高低中等批量插入速度低高高 3、存储引擎的命令

  1. -- 查看数据库支持的存储引擎
  2. show engines;
  3. -- 查询某个数据表的存储引擎
  4. show table status from 数据库名 where name = '数据表名';
  5. -- 创建表时指定存储引擎
  6. create table 表名(
  7.         列名 数据类型 约束,
  8.         ...
  9. ) engine = 存储引擎名;
  10. -- 修改数据表的存储引擎
  11. alter table 表名 engine = 存储引擎名;
  12. -- 设置默认存储引擎
  13. set default_storage_engine = <存储引擎名>
复制代码
4、存储引擎的选择

  1. # InnoDB(MySQL5.5之后默认的存储引擎)
  2. 1. 优点:
  3.                 1)InnoDB 提供了具有提交、回滚、崩溃恢复能力的事务安全。
  4.                 2)InnoDB 采用行锁,适合处理并发写操作。
  5. 2. 缺点:
  6.                 会占用更多的磁盘空间以保留数据和索引
  7. 3. 场景:
  8.                 1)对事务的完整性和安全性有比较高的要求。
  9.                 2)在并发条件下要求数据的一致性,写多读少。
  10. # MyISAM(MySQL5.5之前默认的存储引擎)
  11. 1. 优点:
  12.                 1)MyISAM 内存要求低,节约资源。
  13.                 2)MyISAM 采用表锁,读取速度快,查询效率高
  14. 2. 缺点:
  15.                 1)不支持事务和外键操作
  16.                 2)不适合并发写操作
  17. 3. 场景:
  18.                 1)对事务的完整性、并发性要求不是很高。
  19.                 2)以查询操作为主,只有很少的更新和删除操作,读多写少
  20.                
  21. # MEMORY
  22. 1. 特点:
  23.                 将所有数据保存在内存中,在需要快速定位记录和其他类似数据环境下,可以提供更快的访问。
  24. 2. 使用场景:
  25.                 通常用于更新不太频繁的小表,用以快速得到访问结果。
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4