MySQL中一条SQL到底是如何执行的?
sinye56 2024-09-21 02:23 2 浏览 0 评论
MySQL简介
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为数据库。
近年来,随着MySQL的不断发展,越来越多的互联网公司也选择了MySQ作为数据库存储,其中不乏一些大厂,说明MySQL越来越受开发者的青睐。
MySQL体系结构
- 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数据库开源特性,产生了很多种不同的存储引擎,下面来介绍几种常用的存储引擎
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存储引擎)将表中的数据存放在内存中,如果数据库重启或发生崩溃,表中的数据都将消失。它非常适合
用于存储临时数据的临时表,以及数据仓库中的纬度表。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到底执行了哪些操作?
如上图所示
- 客户端SQL发送到MySQL服务端,首先会去查询缓存里面查找,如果多次执行同一个SQL是会命中缓存中,此时直接通过缓存来取数据
- 若没有命中查询缓存,则将SQL发送给解析器,解析器会对SQL过行语法、语义分析,同时也会对SQL合法性进行校验
- SQL语义解析出来后,优化器会对SQL语义进行优化,比如,是走索引还是全表扫描,优化器会根据实际情况来确定一个最优的执行方案(当然,不一定是最优的,只是给出MySQL认为是最优的执行方案)
- 优化完毕后,就给到执行器进行执行SQL,取出SQL执行结果
- 最后将执行结果返回给客户端
简单归纳一下,一条SQL在MySQL中的执行过程如下:SQL ==> 查询缓存 ==> 解析器 ==> 优化器 ==> 执行器
当然,实际的过程远远比这个要复杂,这里只是列出来大致的步骤和过程,方便大家理解
相关推荐
- Linux在线安装JDK1.8
-
首先在服务器pingwww.baidu.com查看是否可以连网然后就可以在线下载一、下载安装JDK1.81、在下载安装的同时做好一些准备工作...
- Linux安装JDK,超详细
-
1、了解RPMRPM是Red-HatPackageManager(RPM软件包管理器)的缩写,这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是开放式的,现在包括OpenLinux...
- Linux安装jdk1.8(超级详细)
-
前言最近刚购买了一台阿里云的服务器准备要搭建一个网站,正好将网站的一个完整搭建过程分享给大家!#一、下载jdk1.8首先我们需要去下载linux版本的jdk1.8安装包,我们有两种方式去下载安装...
- Linux系统安装JDK教程
-
下载jdk-8u151-linux-x64.tar.gz下载地址:https://www.oracle.com/technetwork/java/javase/downloads/index.ht...
- 干货|JDK下载安装与环境变量配置图文教程「超详细」
-
1.JDK介绍1.1什么是JDK?SUN公司提供了一套Java开发环境,简称JDK(JavaDevelopmentKit),它是整个Java的核心,其中包括Java编译器、Java运行工具、Jav...
- Linux下安装jdk1.8
-
一、安装环境操作系统:CentOSLinuxrelease7.6.1810(Core)JDK版本:1.8二、安装步骤1.下载安装包...
- Linux上安装JDK
-
以CentOS为例。检查是否已安装过jdk。yumlist--installed|grepjdk或者...
- Linux系统的一些常用目录以及介绍
-
根目录(/):“/”目录也称为根目录,位于Linux文件系统目录结构的顶层。在很多系统中,“/”目录是系统中的唯一分区。如果还有其他分区,必须挂载到“/”目录下某个位置。整个目录结构呈树形结构,因此也...
- Linux系统目录结构
-
一、系统目录结构几乎所有的计算机操作系统都是使用目录结构组织文件。具体来说就是在一个目录中存放子目录和文件,而在子目录中又会进一步存放子目录和文件,以此类推形成一个树状的文件结构,由于其结构很像一棵树...
- Linux文件查找
-
在Linux下通常find不很常用的,因为速度慢(find是直接查找硬盘),通常我们都是先使用whereis或者是locate来检查,如果真的找不到了,才以find来搜寻。为什么...
- 嵌入式linux基本操作之查找文件
-
对于很多初学者来说都习惯用windows操作系统,对于这个系统来说查找一个文件简直不在话下。而学习嵌入式开发行业之后,发现所用到的是嵌入式Linux操作系统,本想着跟windows类似,结果在操作的时...
- linux系统查看软件安装目录的方法
-
linux系统下怎么查看软件安装的目录?方法1:whereis软件名以查询nginx为例子...
- Linux下如何对目录中的文件进行统计
-
统计目录中的文件数量...
- Linux常见文件目录管理命令
-
touch用于创建空白文件touch文件名称mkdir用于创建空白目录还可以通过参数-p创建递归的目录...
- Linux常用查找文件方法总结
-
一、前言Linux系统提供了多种查找文件的命令,而且每种查找命令都具有其独特的优势,下面详细总结一下常用的几个Linux查找命令。二、which命令查找类型:二进制文件;...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle忘记用户名密码 (59)
- oracle11gr2安装教程 (55)
- mybatis调用oracle存储过程 (67)
- oracle spool的用法 (57)
- oracle asm 磁盘管理 (67)
- 前端 设计模式 (64)
- 前端面试vue (56)
- linux格式化 (55)
- linux图形界面 (62)
- linux文件压缩 (75)
- Linux设置权限 (53)
- linux服务器配置 (62)
- mysql安装linux (71)
- linux启动命令 (59)
- 查看linux磁盘 (72)
- linux用户组 (74)
- linux多线程 (70)
- linux设备驱动 (53)
- linux自启动 (59)
- linux网络命令 (55)
- linux传文件 (60)
- linux打包文件 (58)
- linux查看数据库 (61)
- linux获取ip (64)
- 关闭防火墙linux (53)