MySQL优化学习 | 体系结构

99 阅读2分钟

这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战

前言

当我们通过数据库连接工具(如常见的Navicat,idea自带的连接工具等),编写一条SQL语句执行后,它经历了哪些步骤,最后将结果返回给我们,为什么选择数据库的时候要选择MySQL?

MySQL体系结构

image.png

我们这里大致了解一下MySQL几个主要结构。

客户端

客户端指的就是一些连接工具,发送请求到数据库。

服务层

接收到客户端请求,通过一系列的处理最后响应给客户端,我们语句的执行主要就是在这里完成的。 连接管理器 控制数据库的连接 查询解析器 当我们拿到一个条sql语句的时候在这里会对它进行提取,解释其合法性。 查询优化器 解释器通过后,在这里我们会对执行sql的进行优化,例如会将where条件后面筛选力度大的放在最左边,虽然解释器会帮我们做一些优化,但是在书写时我们应该自己去规范自己,养成良好习惯。 查询缓存 细心的你会发现,但我们执行同一条sql语句两次,第二次查询的耗时为0.001s,这是因为查询相同的数据,数据库会直接返回缓存里的数据。

存储引擎层

学习MySQL不得不了解的就是它的存储引擎了,最常见的就是MyISAMInnoDb了。 MySQL存储引擎 注意:存储引擎只针对表,所以一个数据库里可以允许有多个不同的引擎

image.png

InnoDB存储引擎

  • 5.5.8后指定为默认存储引擎 支持事务和高并发
  • 采用表空间保存文件
  • 支持事务处理 存储特性
  • 表空间有两种形式
      1. 使用系统表空间:ibdataN(所有数据放在一个文件中)
      1. 5.6 独立表空间:tablename.ibd(推荐)
  • 设置innodb_file_per_table决定表空间模式

如何设置?

SHOW VARIABLES LIKE 'innodb_file_per_table' 

image.png

ON表示当前使用的是独立表空间结构 可以通过以下语句切换成系统表空间结构

SET GLOBAL innodb_file_per_table = ON

为什么推荐独立表空间?

  1. 系统表空间 all in one 不利于管理
  2. 系统表空间会产生io瓶颈
  3. 系统表空间很难回收储存空间
  4. 独立表空间使用optimize table命令回收存储表空间