我眼中的Mysql
开篇简介:首先大部分程序小伙伴工作和生活中注定与一个叫Mysql的软件相爱相杀,它无处不在,好多小伙伴说别跟我扯没用的就是往里干,完事再说。作为一个爱好世界和平的猿!帮你解析Mysql
介绍Mysql
百度是这么介绍Mysql的:关系型数据库管理系统。
何为关系型;
采用了关系模型来组织数据的数据库,其以行和列的形式存储数据,以便于用户理解,关系型数据库这一系列的行和列被称为表,一组表组成了数据库。用户通过查询来检索数据库中的数据,而查询是一个用于限定数据库中某些区域的执行代码。关系模型可以简单理解为二维表格模型,而一个关系型数据库就是由二维表及其之间的关系组成的一个数据组织。
大哥至于写这么长不 我好困
我认为的关系:表内部、表之间、数据之间都是有关系的。
mysql组件
由SQL接口,解析器,优化器,缓存,存储引擎等组成的
废话少说上图:
- Management Serveices & Utilities(管理处理器):系统管理和控制工具
- connectors(连接器):与其他编程语言中的sql 语句进行交互,如php、java等,指的就是mysql的客户端
- Connection Pool (连接池):管理缓冲用户连接,线程处理等需要缓存的需求
authentication 验证机制,验证用户名,密码,Ip,权限
Thread Reuse 分配线程.
Connection Limits 链接限制(池子大小);
Check Memory 检查连接池内存空间大小,如用了多少还剩多少,有多少个连接正在运行之类的检查
caches 缓存池
- SQL Interface (SQL接口):接受用户的SQL命令,并且返回用户需要查询的结果。
比如select from就是调用 SQL Interface
- Parser(解析器):SQL命令传递到解析器的时候会被解析器验证和解析。
主要功能:
a . 将SQL语句分解成数据结构,并将这个结构传递到后续步骤,后面SQL语句的传递和处理就是基于这个结构的
b. 如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的,语句将不会继续执行下去
- Optimizer (查询优化器):SQL语句在查询之前会使用查询优化器对查询进行优化(产生多种执行计划,最终数据库会选择最优化的方案去执行,尽快返会结果) 他使用的是“选取-投影-联接”策略进行查询。
用一个例子就可以理解: select uid,name from user where gender = 1;
这个select 查询先根据where 语句进行选取,而不是先将表全部查询出来以后再进行gender过滤
这个select查询先根据uid和name进行属性投影,而不是将属性全部取出以后再进行过滤
将这两个查询条件联接起来生成最终查询结果
- Cache和Buffer (查询缓存):如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据,这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等。
- Engine (存储引擎):存储引擎是MySql中具体的与文件打交道的子系统,Mysql的存储引擎是插件式的,根据MySql AB公司提供的文件访问层的一个抽象接口来定制一种文件访问机制(这种访问机制就叫存储引擎)
有很多种存储引擎,各个存储引擎的优势各不一样,最常用的MyISAM,InnoDB.
MyISAM引擎,它查询速度快,有较好的索引优化和数据压缩技术。但是它不支持事务。
InnoDB支持事务,并且提供行级的锁定,应用也相当广泛
SQL 语句执行过程
数据库通常不会被直接使用,而是由其它语言通过SQL语句调用mysql,由mysql处理并返回执行结果。
- 首先Mysql接受到SQL语句后,程序的请求会通过mysql的connectors(连接器)与其进行交互。
- 请求到达后,会暂时存放在connection pool(连接池)中并由Management Serveices & Utilities(管理处理器)管理。
- 当请求从等待队列进入到处理队列,管理器再将请求丢给SQL InterfaceS(SQL接口)。
- SQL InterfaceS(SQL接口)收到请求后,将请求进行hash处理并与缓存中的结果进行对比,如果完全匹配则通过缓存直接返回处理结果。
否则换条路走
(1). SQL InterfaceS(SQL接口)丢给后面的Parser(解释器),解释器会判断SQL语句正确与否,若正确则将其转化为数据结构。
(2)Parser(解释器)处理完,便来到后面的Optimizer(优化器),产生多种执行计划,最终数据库会选择最优化的方案去执行。
(3)确定最优执行计划后,SQL语句此时便可以交由Engine(存储引擎)处理,存储引擎将会到后端的存储设备中取得相应的数据,并原路返回给程序。
注释点
mysql 如何缓存查询数据
存储引擎处理完数据,并将其返回给程序的同时,它还会将一份数据保留在缓存中,以便更快速的处理下一次相同的请求,mysql会将查询的语句、执行结果等进行hash,并保留在cache中,等待下次查询。
buffer与cache的区别
它们之间的区别:简单的说就是,buffer是写缓存,cache是读缓存。
如何判断缓存中有已缓存需要的数据
第一次查询后,mysql便将查询语句以及查询结果进行hash处理并保留在缓存中,SQL查询到达之后,对其进行同样的hash处理后,将两个hash值进行对照,一样则命中,从缓存中返回查询结果;否则,换条路走。
日志文件
a.查询所有日志情况
mysql> show variables like “%log%”;
b、错误日志:记录启动、运行或停止mysqld时出现的问题。
默认开启 记录服务在启动和运行过程中产生的错误信息log-error=/var/log/mysqld.log
mysql> show variables like ‘log_error’;
c、通用日志:记录建立的客户端连接和执行的语句。
查看通用日志文件参数
mysql> show variables like ‘general%’;
查看通用日志是否开启
mysql> show variables like ‘general_log’;
#查询通用日志文件的路径
mysql> show variables like ‘general_log_file’;
查看通用日志的输出类型:table或file
mysql> show variables like ‘%log_output%’;
d、二进制日志:记录所有更改数据的语句,还用于复制。
记录的是除查询之外的所有命令。存放目录位于/var/lib/mysql。
mysql> show variables like “%log_bin%”;
e、慢查询日志:记录所有执行时间超过long_query_time秒的所有查询或不使用索引的查询。
记录超过指定时间显示查询结果的sql命令,存放目录位于/var/lib/mysql。
mysql> show variables like ‘slow_query_log_file’;