MySQL基本架构

mysql基本架构图:

MySQL大概分server层和储存引擎层两部分。

server层分上面的图片几个主要组件。主要是有Mysql核心服务,跨存储引擎层的功能都在server层实现,比如储存过程、触发器、视图等。

储存引擎层主要负责数据的提取和存储,其中架构模式是插拔式,支持InnoDB、MyISAM、Memory等多个引擎。现在最常用的引擎是InnoDB,从MYSQL5.5.5版本之后默认引擎就设置为InnoDB。

连接器

命令行:

1
mysql -h$ip -P$port -u$user -p
  • 密码可以跟着-p后面。但是生产环境不建议,因为不安全。

  • 如果用户名和密码错误,提示”Access denied for user”的错误。

  • 登录成功之后,使用show processlist命令查看,其中的 Command 列显示为“Sleep”的这一行,就表示现在系统里面有一个空闲连接。

    • 客户端如果太长时间没动静,连接器就会自动将它断开。这个时间是由参数 wait_timeout 控制的,默认值是 8 小时。

    • 如果在连接被断开之后,客户端再次发送请求的话,就会收到一个错误提醒: Lost connection to MySQL server during query。这时候如果你要继续,就需要重连,然后再执行请求了。

    • 数据库连接又分长连接和短链接,因为建立连接比较复杂,建议使用长连接。但是使用长连接也是有问题,MySQL 在执行过程中临时使用的内存是管理在连接对象里面的。这些资源会在连接断开的时候才释放。所以如果长连接累积下来,可能导致内存占用太大,就会导致数据库占用内存过大,被系统强制杀掉(OOM),现象就是MYSQL异常重启。

      解决方案:

      • 定期断开长连接。使用一点时间或者是一个程序里面判断执行一个执行的大查询之后,断开链接,之后查询再去链接。
      • 你使用的是mysql5.7甚至更高的版本,执行一个大的操作之后可以使用mysql_reset_connection重新初始化连接资源

查询缓存

建立连接之后,执行select查询,第二部就是:查询缓存。

查询环境是使用key-value格式去存储,key是执行的sql,value是返回的数据。如果缓存查询不到就去执行下面的处理。

查询缓存不建议使用

​ 因为缓存比较容易失效,只要有对一个表的更新,这个表上的所有查询缓存都会被清空。除非你是一张码表,不会经常更新数据。

mysql提供一个按需分配,需要将参数 query_cache_type 设置成DEMAND,默认sql查询是不会执行缓存查询。如果想使用缓存查询就 SQL_CACHE 显式指定。

例如:

1
select SQL_CACHE * from T where ID=10

分析器

分析器就是对执行SQL进行解析,根据词法分析的结果,语法分析器会根据语法规则,判断你输入的这个 SQL 语句是否满足 MySQL 语法。如果你的语句不对,就会收到“You have an error in your SQL syntax”错误提示。

一般语法错误会提示第一个出现错误的位置,所以你要关注的是紧接“use near”的内容。

优化器

执行分析器之后就是执行优化器了,优化器主要的作用是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。不同的执行方式,效率都会有很大的差别。

执行器

MySQL 通过分析器知道了你要做什么,通过优化器知道了该怎么做,于是就进入了执行器阶段,开始执行语句。

对于表的权限是在执行阶段判断。

笔记:MySQL实战45讲