MySQL不是表结构定义文件说明1.1–上海怡健医学

1、MySQL 文件说明

1.1 MySQL 文件夹文件

在 Linux 服务器上安装 MySQL 后,有以下文件:

图片[1]-MySQL不是表结构定义文件说明1.1–上海怡健医学-4747i站长资讯

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、数据文件

图片[2]-MySQL不是表结构定义文件说明1.1–上海怡健医学-4747i站长资讯

引擎创建的表:

.frm 表结构定义文件

.MYD 数据文件

.MYI 索引文件

引擎创建的表:

.frm 表结构定义文件

.ibd 数据文件和索引文件

2、逻辑架构图

图片[3]-MySQL不是表结构定义文件说明1.1–上海怡健医学-4747i站长资讯

&

池:连接池

SQL : SQL 接口

: 解析器

主要功能:

: 查询优化器

缓存和:查询缓存

: 存储引擎

简而言之,一个存储引擎就是如何存储数据,如何为存储的数据建立索引,如何更新和查询数据。

3、图层对象

3.1、Sql语句执行流程

图片[4]-MySQL不是表结构定义文件说明1.1–上海怡健医学-4747i站长资讯

3.2、连接器

**第一步,你会先连接到这个数据库,这个时候连接器会接收到你。连接器负责与客户端建立连接、获取权限、维护和管理连接。**连接命令一般是这样写的:

mysql -h$ip -P$port -u$user -p

输入命令后,您需要在交互式对话框中输入密码。虽然密码也可以在命令行中直接写在-p之后,但是这样可能会导致你的密码被泄露。如果您要连接到生产服务器,强烈建议您不要这样做。

连接命令中的mysql是一个客户端工具,用来与服务器建立连接。完成经典 TCP 握手后,连接器将开始验证您的身份,这次使用您输入的用户名和密码。

这意味着用户成功建立连接后,即使您使用管理员帐户修改用户的权限,也不会影响现有连接的权限。修改完成后,只有新创建的连接才会使用新的权限设置。

连接完成后,如果没有后续动作,则连接处于空闲状态,可以在show命令中看到。文中的图是show的结果,列显示“Sleep”这一行,表示现在系统有空闲连接。

图片[5]-MySQL不是表结构定义文件说明1.1–上海怡健医学-4747i站长资讯

如果客户端长时间不活动,连接器会自动断开连接。这个时间由一个参数控制,默认值为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; 

图片[6]-MySQL不是表结构定义文件说明1.1–上海怡健医学-4747i站长资讯

预处理器

预处理器会进一步检查解析树是否合法,如表名是否存在、列是否存在等,同时会检查用户是否有权限操作该表。

3.5、优化器

在开始执行 SQL 之前,还要经过优化器的处理。

查询优化器的作用是根据解析树生成不同的执行计划,然后选择一个最优的执行计划。MySQL 使用基于成本模型的优化器,无论哪个执行计划在执行时成本最低。而且是sum的代价之和,通常是我们评价一个查询的执行效率的常用指标。

#查看上次查询成本开销 show status like 'Last_query_cost'; 

优化器的优化处理:

3.6、执行器

MySQL 通过分析器知道你想做什么,通过优化器知道如何去做,并得到一个查询计划。所以它进入执行者阶段并开始执行语句。

(1)开始执行的时候,首先要判断你是否有权限在这张表上执行查询,如果没有,会返回无权限的错误。(在项目实现中,如果查询缓存命中,会在查询缓存中,当查询缓存返回结果时,进行权限验证。

(2)如果有权限,使用指定的存储引擎打开表启动查询。执行器会使用引擎提供的查询接口,根据表的引擎定义提取数据。

比如我们例子中的表中,字段是主键,那么的执行流程如下:

调用引擎接口从主键索引中检索 = 14 的记录。主键索引等效查询只会查询一条记录,并将记录直接返回给客户端。

至此,语句已经执行完毕。

假设该字段不是索引,那么查询只能执行全表扫描。那么的执行流程如下:

调用引擎接口取该表的第一行,判断值是否为14,如果不是则跳过,如果是则将该行缓存到结果集中;调用引擎接口取“下一行”,重复同样的判断逻辑,直到拿到该表的最后一行。执行器向客户端返回一个结果集,该结果集由所有满足上述遍历过程中的条件的行组成。

至此,语句被执行

文章来源:http://www.toutiao.com/a6914521970176442887/

------本页内容已结束,喜欢请分享------

感谢您的来访,获取更多精彩文章请收藏本站。

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享