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

MySQL简介MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品 。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为数据库 。
近年来,随着MySQL的不断发展,越来越多的互联网公司也选择了MySQ作为数据库存储,其中不乏一些大厂,说明MySQL越来越受开发者的青睐 。
MySQL体系结构

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

文章插图
 
  • Connectors组件提供对外的连接,供JDBC、ODBC、php、 Python等进行数据库连接
  • 连接池组件(Connection Pool) 负责接收外部请求,将请求转发到对应的模块,每个连接成功的请求都会分配一个线程来负责维护客户端与MySQL服务器的连接,该线程负责接收客户端的请求,返回结果给客户端
  • 管理服务和工具组件(Management Service & Utilities)负责MySQL服务端的管理,如备份、恢复、安全、配置等
  • SQL接口组件(SQL Interface) 负责处理DML、DDL、存储过程、触发器等SQL操作,并返回结果
  • 查询分析器组件(Parser) 分析SQL(检查语法、合法性)
  • 优化器组件(Optimizer) 优化SQL命令进行标准的优化分析
  • 缓冲组件(Caches & Buffers) 用于查询数据的缓冲和缓存
  • 插件式存储引擎(Pluggable Storage Engines) MySQL特有的特性,提供了各种类型的存储引擎用于不同的业务场景
  • 物理文件(File System) 存储MySQL 数据库文件、日志文件、redo日志、Undo日志、索引等文件
MySQL区别于其他数据库最重要的一个特点就是插件式存储引擎
存储引擎是底层物理结构的实现,每个存储引擎开发者可以按照自己的意愿来进行开发
存储引擎是基于表的,而不是数据库 。也就是同一个库中的不同表可以采用不同的存储引擎
存储引擎的好处是,每个存储引擎都有各自的特点,能够根据具体的应用建立不同存储引擎表
MySQL存储引擎【MySQL中一条SQL到底是如何执行的?】由于MySQL数据库开源特性,产生了很多种不同的存储引擎,下面来介绍几种常用的存储引擎
InnoDB存储引擎InnoDB存储引擎支持事务,其设计目标主要面向在线事务处理(OLTP)的应用
其特点是行锁设计、支持外键,并支持类似于Oracle的非锁定读,即默认读取操作不会产生锁
从MySQL数据库5.5.8版本开始,InnoDB存储引擎是默认的存储引擎
InnoDB通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了SQL标准的4种隔离级别,默认为REPEATABLE级别 。同时,使
用一种被称为next-key locking的策略来避免幻读(phantom)现象的产生 。除此之外,InnoDB储存引擎还提供了插入缓冲(insert
buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead)等高性能和高可用的功能
实际工作中,InnoDB应该是用的最多的存储引擎
MyISAM存储引擎MyISAM存储引擎不支持事务、表锁设计,支持全文索引,主要面向一些OLAP数据库应用
在MySQL 5.5.8版本之前MyISAM存储引擎是默认的存储引擎(除windows版本外),5.5.8以后默认存储引擎就换成InnoDB
MyISAM存储引擎表由MYD和MYI组成,MYD用来存放数据文件,MYI用来存放索引文件
注意 对于MyISAM存储引擎表,MySQL数据库只缓存其索引文件,数据文件的缓存交由操作系统本身来完成,这与其他使用LRU算法缓存
数据的大部分数据库大不相同 。此外,在MySQL 5.1.23版本之前,无论是在32位还是64位操作系统环境下,缓存索引的缓冲区最大只能设置为4GB 。在之后的版本中,64位系统可以支持大于4GB的索引缓冲区
NDB存储引擎NDB存储引擎是一个集群存储引擎,类似于Oracle的RAC集群,不过与Oracle RAC share everything架构不同的是,其结构是
sharenothing的集群架构,因此能提供更高的可用性
NDB的特点是数据全部放在内存中(从MySQL 5.1版本开始,可以将非索引数据放在磁盘上),因此主键查找(primary key lookups)的
速度极快,并且通过添加NDB数据存储节点(Data Node)可以线性地提高数据库性能,是高可用、高性能的集群系统
关于NDB存储引擎,有一个问题值得注意,那就是NDB存储引擎的连接操作(JOIN)是在MySQL数据库层完成的,而不是在存储引擎层完成的 。这意味着,复杂的连接操作需要巨大的网络开销,因此查询速度很慢
Memory存储引擎Memory存储引擎(之前称HEAP存储引擎)将表中的数据存放在内存中,如果数据库重启或发生崩溃,表中的数据都将消失 。它非常适合


推荐阅读