1、MySQL 文件说明
1.1 MySQL 文件夹文件
在 Linux 服务器上安装 MySQL 后,有以下文件:
1.2、主日志文件
1)错误日志()
默认开启,错误日志从5.5.7开始无法关闭。错误日志记录了运行过程中遇到的所有严重错误信息,以及每次 MySQL 启动和关闭的详细信息。.
默认错误日志名称:.err。
错误日志中记录的信息可以通过log-error和log-来定义,其中log-err定义了是否开启错误日志的功能以及错误日志的存放位置,log-定义了是否警告信息还定义到日志中的错误。
#可以直接定义为文件路径,也可以为ON|OFF
log_error=/var/log/mysqld.log
#只能使用1|0来定义开关启动,默认是启动的
log_warings=1
2) 二进制日志(bin log)
默认是关闭的,需要通过下面的配置来开启。:
log-bin=mysql-bin
其中mysql-bin为日志文件,日志文件全名:mysql-bin-.log
记录数据库中所有的ddl语句和dml语句,但不包括语句的内容。语句以事件的形式保存,描述了数据变化的顺序,还包括了每个更新语句的执行时间信息。如果是 DDL 语句,则直接记录到日志中,而 DML 语句必须通过事务提交,才能记录在日志中。
主要用于实现MySQL主从复制、数据备份、数据恢复。
3)一般查询日志(查询日志)
默认情况下,常规查询日志记录是关闭的。
由于一般的查询日志记录了所有的用户操作,包括增删改查,在大并发操作的环境中会产生大量的信息,造成不必要的磁盘IO,影响mysql的性能。如果不是出于调试数据库的目的,建议不要打开查询日志。
mysql> show global variables like 'general_log';
开启方式:
#启动开关
general_log={ON|OFF}
#日志文件变量,而general_log_file如果没有指定,默认名是host_name.log
general_log_file=/PATH/TO/file
#记录类型
log_output={TABLE|FILE|NONE}
4)慢查询日志
默认为关闭。
需要使用以下设置打开它:
#开启慢查询日志
slow_query_log=ON
#慢查询的阈值
long_query_time=10
#日志记录文件如果没有给出file_name值, 默认为主机名,后缀为-slow.log。如果给出了文件名, 但不是绝对路径名,文件则写入数据目录。
slow_query_log_file= file_name
记录所有执行时间超过一秒的查询,方便收集查询时间长的SQL语句
多少SQL查询超过慢查询时间阈值:SHOW LIKE ‘%%’;
1.3、数据文件
引擎创建的表:
.frm 表结构定义文件
.MYD 数据文件
.MYI 索引文件
引擎创建的表:
.frm 表结构定义文件
.ibd 数据文件和索引文件
2、逻辑架构图
&
池:连接池
SQL : SQL 接口
: 解析器
主要功能:
: 查询优化器
缓存和:查询缓存
: 存储引擎
简而言之,一个存储引擎就是如何存储数据,如何为存储的数据建立索引,如何更新和查询数据。
3、图层对象
3.1、Sql语句执行流程
3.2、连接器
**第一步,你会先连接到这个数据库,这个时候连接器会接收到你。连接器负责与客户端建立连接、获取权限、维护和管理连接。**连接命令一般是这样写的:
mysql -h$ip -P$port -u$user -p
输入命令后,您需要在交互式对话框中输入密码。虽然密码也可以在命令行中直接写在-p之后,但是这样可能会导致你的密码被泄露。如果您要连接到生产服务器,强烈建议您不要这样做。
连接命令中的mysql是一个客户端工具,用来与服务器建立连接。完成经典 TCP 握手后,连接器将开始验证您的身份,这次使用您输入的用户名和密码。
这意味着用户成功建立连接后,即使您使用管理员帐户修改用户的权限,也不会影响现有连接的权限。修改完成后,只有新创建的连接才会使用新的权限设置。
连接完成后,如果没有后续动作,则连接处于空闲状态,可以在show命令中看到。文中的图是show的结果,列显示“Sleep”这一行,表示现在系统有空闲连接。
如果客户端长时间不活动,连接器会自动断开连接。这个时间由一个参数控制,默认值为8小时。
如果客户端在断开连接后再次发送请求安卓连接mysql数据库,会收到错误信息:Lost to MySQL query。这时候如果要继续,需要重新连接,然后执行请求。
在数据库中,长连接是指连接成功后,如果客户端继续有请求,将一直使用同一个连接。短连接是指每执行几次查询就断开连接,为下一次查询重新建立一个新的连接。
建立连接的过程通常比较复杂,所以我建议大家在使用中尽量减少建立连接的动作,也就是尽量使用长连接。
但是,在全部使用长连接之后,你可能会发现有时 MySQL 占用的内存增长非常快,因为 MySQL 在执行过程中临时使用的内存是在连接对象中管理的。这些资源只有在连接断开时才会被释放。因此,如果长连接累积,可能会导致内存使用过多,被系统强行杀死(OOM)。从现象看,MySQL异常重启。
如何解决这个问题呢?您可以考虑以下两个选项。
3.3、查询缓存(.0已经放弃缓存功能)
连接建立后,就可以执行语句了。执行逻辑会来到第二步:查询缓存。
MySQL得到查询请求后,会先到查询缓存中查看之前是否执行过这条语句。先前执行的语句及其结果可以作为键值对直接缓存在内存中。key是查询语句hash后的值安卓连接mysql数据库,value是查询的结果。如果你的查询可以直接在这个缓存中找到key,那么value会直接返回给客户端。
如果该语句不在查询缓存中,它将继续执行下一个阶段。执行完成后,执行结果将存储在查询缓存中。可以看到,如果查询命中缓存,MySQL 可以直接返回结果,无需执行后面的复杂操作,效率很高。
但大多数时候我会建议你不要使用查询缓存,为什么?因为查询缓存通常弊大于利。
查询缓存很容易失效。如果一个表被修改,与该表相关的所有查询缓存都将被清除。对于频繁修改的表,缓存命中率会很低。因此,只有不经常修改的表,例如系统配置表,才适合查询缓存。
查询缓存默认关闭
show variables like 'query_cache_type';
查询缓存命中
SHOW STATUS LIKE 'Qcache_hits'
值 0 或 OFF 禁用缓存的使用。
值 1 或 ON 启用缓存,以 . 开头的语句除外。
当值为 2 或 时,只有以 开头的语句。
需要修改配置文件,在文件中添加如下内容开启缓存:
query_cache_type=2
那么如何清除查询缓存呢?
但是 MySQL 8.0 版本直接删除了查询缓存的整个功能
3.4、分析器
如果缓存没有命中,则继续执行该语句。这时候首先解析语句。
这个阶段是 MySQL 的解析器和预处理模块的功能。
首先判断文本的语法是否正确,然后从文本中提取表、列和各种查询条件,本质上就是编译一条SQL语句的过程,涉及到词法分析、句法分析、语义分析等阶段.
解析器将首先进行“词法分析”。
就是将完整的SQL拆分成字符串:
select customer_id,first_name,last_name from customer where customer_id=14;
拆分为 10 个字符串:
select,customer_id,first_name,last_name,from,customer,where,customer_id, =,14
MySQL从“”关键字识别它,这是一个查询语句,将字符串“”识别为“表名”,将字符串“”识别为“列”。
然后解析器进行“语法分析”。
这一步是针对词法分析的结果,语法分析器进行语法检查,判断是否符合MySQL语法。
如果语法正确,会根据 MySQL 定义的语法规则生成解析树:
比如sql
select customer_id,first_name,last_name from customer where customer_id=14;
预处理器
预处理器会进一步检查解析树是否合法,如表名是否存在、列是否存在等,同时会检查用户是否有权限操作该表。
3.5、优化器
在开始执行 SQL 之前,还要经过优化器的处理。
查询优化器的作用是根据解析树生成不同的执行计划,然后选择一个最优的执行计划。MySQL 使用基于成本模型的优化器,无论哪个执行计划在执行时成本最低。而且是sum的代价之和,通常是我们评价一个查询的执行效率的常用指标。
#查看上次查询成本开销 show status like 'Last_query_cost';
优化器的优化处理:
3.6、执行器
MySQL 通过分析器知道你想做什么,通过优化器知道如何去做,并得到一个查询计划。所以它进入执行者阶段并开始执行语句。
(1)开始执行的时候,首先要判断你是否有权限在这张表上执行查询,如果没有,会返回无权限的错误。(在项目实现中,如果查询缓存命中,会在查询缓存中,当查询缓存返回结果时,进行权限验证。
(2)如果有权限,使用指定的存储引擎打开表启动查询。执行器会使用引擎提供的查询接口,根据表的引擎定义提取数据。
比如我们例子中的表中,字段是主键,那么的执行流程如下:
调用引擎接口从主键索引中检索 = 14 的记录。主键索引等效查询只会查询一条记录,并将记录直接返回给客户端。
至此,语句已经执行完毕。
假设该字段不是索引,那么查询只能执行全表扫描。那么的执行流程如下:
调用引擎接口取该表的第一行,判断值是否为14,如果不是则跳过,如果是则将该行缓存到结果集中;调用引擎接口取“下一行”,重复同样的判断逻辑,直到拿到该表的最后一行。执行器向客户端返回一个结果集,该结果集由所有满足上述遍历过程中的条件的行组成。
至此,语句被执行
文章来源:http://www.toutiao.com/a6914521970176442887/
感谢您的来访,获取更多精彩文章请收藏本站。

暂无评论内容