本节目标:
1、了解MySQL语句的执行流程
2、理解MySQL的架构与内部模块
3、掌握InnoDB存储引擎的磁盘与内存结
一、MySQL简介
MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面,MySQL是最好的RDBMS(RelationalDatabaseManagementSystem,关系数据库管理系统)应用软件之一。
MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言。MySQL软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库。
MySQL发展历史:
MySQL主要分支:
MariaDB:Oracle收购MySQL之后,MySQL创始人之一Monty担心MySQL发展的未来(开发缓慢、封闭、可能闭源),就创建了一个分支MariaDB(年),默认使用Maria存储引擎,它是原MyISAM存储引擎的升级版本。
PerconaServer:基于InnoDB存储引擎,提升了性能和易管理性,形成了XtraDB引擎。
网易的InnoSQL
极数据云舟的ArkDB
二、一条SQL语句是如何执行的?
SQL执行流程.png
1.通信协议
首先,MySQL必须要运行一个服务,监听默认的端口。在我们开发系统跟第三方对接的时候,必须要弄清楚的有两件事。第一个就是通信协议,比如我们是用HTP还是WebService还是TCP?第二个是消息格式,比如我们用XML格式,还是JSON格式,还是定长格式?报文头长度多少,包含什么内容,每个字段的详细含义。
MySQL是支持多种通信协议的,可以使用同步/异步的方式,支持长连接/短连接。这里我们拆分来看。第一个是通信类型。
通信类型:同步或者异步
同步通信的特点:
异步通信的特点:
异步可以避免应用阻塞等待,但是不能节省SQL执行的时间。
如果异步存在并发,每一个SQL的执行都要单独建立一个连接,避免数据混乱。但是这样会给服务端带来巨大的压力(一个连接就会创建一个线程,线程间切换会占用大量CPU资源)。另外异步通信还带来了编码的复杂度,所以一般不建议使用。如果要异步,必须使用连接池,排队从连接池获取连接而不是创建新连接。一般来说我们连接数据库都是同步连接。
同步通信依赖于被调用方,受限于被调用方的性能。也就是说,应用操作数据库,线程会阻塞,等待数据库的返回。
一般只能做到一对一,很难做到一对多的通信。
连接方式:长连接或者短连接
MySQL既支持短连接,也支持长连接。短连接就是操作完毕以后,马上close掉。长连接可以保持打开,减少服务端创建和释放连接的消耗,后面的程序访问的时候还可以使用这个连接。一般我们会在连接池中使用长连接。
保持长连接会消耗内存。长时间不活动的连接,MySQL服务器会断开。
showglobalvariableslikewait_timeout;--非交互式超时时间,如JDBC程序showglobalvariableslikeinteractive_timeout;--交互式超时时间,如数据库工具
默认都是秒,8小时。
我们怎么查看MySQL当前有多少个连接?可以用showstatus命令:
showglobalstatuslikeThread%;
查看MySql连接.png
每产生一个连接或者一个会话,在服务端就会创建一个线程来处理。反过来,如果要杀死会话,就是Kill线程。
有了连接数,怎么知道当前连接的状态?也可以使用SHOWPROCESSLIST;(root用户)查看SQL的执行状态.
dev.mysql.