MySQL中一条SQL到底是如何执行的?( 二 )


用于存储临时数据的临时表,以及数据仓库中的纬度表 。Memory存储引擎默认使用哈希索引,而不是我们熟悉的B+树索引
虽然Memory存储引擎速度非常快,但在使用上还是有一定的限制 。比如,只支持表锁,并发性能较差,并且不支持TEXT和BLOB列类型 。
最重要的是,存储变长字段(varchar)时是按照定常字段(char)的方式进行的,因此会浪费内存
Archive存储引擎Archive存储引擎只支持INSERT和SELECT操作,从MySQL 5.1开始支持索引 。Archive存储引擎使用zlib算法将数据行(row)进行压缩后存储,压缩比一般可达1∶10 。正如其名字所示,Archive存储引擎非常适合存储归档数据,如日志信息 。Archive存储引擎使用行锁来实现高并发的插入操作,但是其本身并不是事务安全的存储引擎,其设计目标主要是提供高速的插入和压缩功能 。
Federated存储引擎Federated存储引擎表并不存放数据,它只是指向一台远程MySQL数据库服务器上的表 。这非常类似于SQL Server的链接服务器和Oracle
的透明网关,不同的是,当前Federated存储引擎只支持MySQL数据库表,不支持异构数据库表 。
Maria存储引擎Maria存储引擎是新开发的引擎,设计目标主要是用来取代原有的MyISAM存储引擎,从而成为MySQL的默认存储引擎 。
Maria存储引擎的特点是:支持缓存数据和索引文件,应用了行锁设计,提供了MVCC功能,支持事务和非事务安全的选项,以及更好的BLOB字符类型的处理性能 。
SQL是如何执行的一条查询的SQL发送到MySQL服务器被执行,返回查询结果,这中间经历了什么?下面我们来看一下一条SQL语句从客户端发送给MySQL服务器,MySQL到底执行了哪些操作?

MySQL中一条SQL到底是如何执行的?

文章插图
 
如上图所示
  • 客户端SQL发送到MySQL服务端,首先会去查询缓存里面查找,如果多次执行同一个SQL是会命中缓存中,此时直接通过缓存来取数据
  • 若没有命中查询缓存,则将SQL发送给解析器,解析器会对SQL过行语法、语义分析,同时也会对SQL合法性进行校验
  • SQL语义解析出来后,优化器会对SQL语义进行优化,比如,是走索引还是全表扫描,优化器会根据实际情况来确定一个最优的执行方案(当然,不一定是最优的,只是给出MySQL认为是最优的执行方案)
  • 优化完毕后,就给到执行器进行执行SQL,取出SQL执行结果
  • 最后将执行结果返回给客户端
简单归纳一下,一条SQL在MySQL中的执行过程如下:SQL ==> 查询缓存 ==> 解析器 ==> 优化器 ==> 执行器
当然,实际的过程远远比这个要复杂,这里只是列出来大致的步骤和过程,方便大家理解




推荐阅读