MySQL 实战45讲-01 数据库的基础架构
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讲