数据库中的SQL是如何执行的?

news2024/9/24 15:20:58

简介

参考文献:03丨学会用数据库的方式思考SQL是如何执行的

以oracle和MySQL为例,讲解了sql是怎么被执行的,并且对比了执行过程中,oracle和MySQL的异同。

个人感觉,讲解的核心是SQL执行时的缓存机制。

Oracle中的sql是如何执行的

自我口述一下

sql语句在提交后,

首先进行“语法检查”,检查sql语法是否正确,关键字等的拼写是否异常;

然后进行“语义检查”,检查sql中涉及到的访问对象是否存在,比如说from的表,或者是select的字段等。

语法检查和语义检查是为了避免sql语句本身出现错误,保证sql语句是可以运行的。

然后进行“权限检查”,检查当前用户是否有所调用表的访问权限,是否可以访问这些数据。

然后进行“共享池检查”, 这一步是检查sql语句及其执行计划是否缓存在共享池中,如果当前有缓存,就将它们取出来,这个过程被称为sql语句的软解析;如果该语句和其对应的执行计划没有缓存过,那sql语句将被送进“优化器”,创建解析树对其解析,同时生成执行计划,这个过程被称为硬解析

在执行计划就位后,就知道了sql该怎么被执行,这时候再进行“执行器”阶段,执行sql语句,返回执行结果。

在这里插入图片描述

共享池(shared pool)是oracle中的术语,是一块内存池,包括了库缓存区数据字典缓存区。库缓存区主要是用来缓存sql语句和其执行计划,数据字典缓存区存储的是Oracle中各种对象,如表、视图、索引等对象,其缓存细粒度更小,但也更实用,当对sql语句进行解析的时候,如果需要相应的对象,那直接去数据字典缓存区去找。

那库缓存过程中,Oracle是怎么进行软解析的呢?

Oracle首先对SQL语句做hash运算,然后根据得到的hash值,在库缓存(library Cache)中查找,找得到就取出来,做软解析,找不到的话那就只能硬解析。

为了提升sql的执行效率,我们应该尽量避免硬解析,因为在sql的执行过程中,创建解析树,生成执行计划是相当耗资源的。

那在Oracle中,如何主动避免使用硬解析呢?

Oracle提供了一种方法,就是绑定变量

Oracle中使用绑定变量来避免一类执行计划的无谓消耗。

在Oracle中,以下两个sql语句是会生成两套执行计划的,即使这两套执行计划是一模一样的:

select * from player where player_id = 1001

select * from player where player_id = 1002

只要后面的常数变了,那么每一次查询都会创建一个新的查询解析。这种花销是不必要的,于是Oracle提出了绑定变量:

select * from player where player_id = :player_id

采用了绑定变量后,在第一次查询后,共享池中就会缓存此类查询的执行计划,主动避免了下次的硬解析。

简单百度了下,Oracle中应该是大量使用绑定变量来主动避免硬解析。但并不是说绑定变量就是万能的,这种类似动态sql的方式,可能过于固化,优化的话也比较难。

当然,以上是官方说法,我不是很懂,只是下意识觉得过于僵硬,不容易变通

MySQL中的sql是如何执行的

Mysql的执行过程跟Oracle有相同的地方,也有不同的地方。

sql语句送入后,

首先进行缓存查询,如果缓存中有这条sql语句,那就直接把结果返回给客户端;如果没有,则进入解析器阶段。需要特殊说明的是,这种缓存查询方式效率不高,在MySQL8.0后就被抛弃了

至于为什么说它查询效率不高,原因很简单。每次表发生变动后,比如说加入了新数据,原先依赖这张表的缓存查询就全部失效被清空,而大部分表实际上都是在时刻变动的,这种缓存机制只对不会更新的静态表有作用,对实时更新的动态表来说,这种缓存机制的作用反而是负面的,反而增加了sql的查询时间,毕竟每次运行完后还要花时间缓存一下结果,哪怕下一秒这个结果就没用了。

解析器阶段,会做语法分析和语义分析;

然后是优化器阶段,确定执行计划;

然后是执行器阶段,执行前会先进行权限鉴定,判断该用户是否具备查询权限。如果具备,则执行sql并返回结果。如果是MySQL8.0以下的版本,如果设置了查询缓存,则会同时将查询结果进行缓存。

在这里插入图片描述

可以看到,MySQL和Oracle的执行流程大体上是相同的,或者说执行思路是相同的。

不同的地方主要是MySQL的引擎特性引起的。MySQL作为一种优秀的开源数据库,其数据引擎采用插件的方式,提供了多种引擎可供选择,甚至,还允许开发人员设置自己的开发引擎。一些具体的开发引擎就不介绍了,放个简单的截图吧。
在这里插入图片描述

需要注意的一点是,MySQL中每个表的设计都可以采用不同的数据库引擎,你完全可以根据表本身的特性,灵活选择其对应的数据库引擎,这也是MySQL的强大之处

另一个需要提的是,如何在sql中查看每一句sql在执行时所使用的资源和时间等信息。即使用profiling。具体用法就不提了,需要用到的时候自己查吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/658217.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法刷题-字符串-重复的子字符串

KMP算法还能干这个 459.重复的子字符串 力扣题目链接 给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。 示例 1: 输入: “abab” 输出: True 解释: 可由子字符串 “ab” 重复两…

计算机网络面试

计算机网络面试 OSI七层模型 七层网络体系结构各层的主要功能: 应用层:为应用程序提供交互服务。在互联网中的应用层协议很多,如域名系统DNS,支持万维网应用的HTTP协议,支持电子邮件的SMTP协议等。表示层:主要负责数据格式的转换,如加密解密、转换翻译、压缩解压缩等。…

Navicat如何连接MySQL

市面上有很多数据库连接工具,比如Navicat、SQLYog、WorkBench等,用的比较多的,比较好用的,还是Navicat。现在我们就来说说Navicat如何连接Mysql,此文仅适用于小白,大神可略过。 1.打开Navicat,点击左上角的【连接】按钮…

(十)异步-什么是异步(1)

一、什么是异步 启动程序时,系统会在内存中创建一个新的进程。 进程: 构成运行程序的资源的集合。这些资源包括虚地址空间、文件句柄和程序运行所需的其他许多东西。 在进程内部,系统创建了一个称为线程的内核对象,它代表了真正…

chatgpt赋能python:Python迭代循环详解:从基础到高级

Python迭代循环详解:从基础到高级 在Python中,迭代循环是一种非常重要的编程概念。它能够让我们在程序运行过程中多次访问一个数据集或序列,并且以各种方式对其进行操作。在本文中,我们将深入探讨Python中的迭代循环,…

RFID课程要点总结_1 Introduction

1. Introduction Comparison of different automatic identification technologies 首先明确一下比较对象。human identification(cost too high)是人力识别就不用说了。 fingerprint identification: stability 稳定,精确度高&#xff1…

GAN:生成对抗网络的突破与应用

第一章:引言 在当今信息时代,人工智能技术的发展如日中天。其中,生成对抗网络(GAN)作为一种强大的生成模型,引起了广泛的关注和研究。GAN通过两个相互对抗的神经网络,即生成器和判别器&#xf…

【深入浅出Nacos原理及调优】「实战开发专题」采用Docker容器进行部署和搭建Nacos服务以及“坑点”

采用Docker容器进行部署和搭建Nacos服务以及“坑点” Docker容器部署Nacos服务安装Docker下载Nacos镜像docker-compose up部署Derby 单机版部署MySQL 单机版部署修改standalone-mysql.yaml MySQL 集群模式部署 初始化nacos数据库Nacos服务的MySQL版本数据库脚本脚本内容 手动创…

chatgpt赋能python:Python遍历4层的最佳实践

Python遍历4层的最佳实践 如果您对搜索引擎优化(SEO)和网络爬虫有所了解,那么您可能会知道遍历多层链接的重要性。在这篇文章中,我将介绍如何使用Python编写一个简单而有效的爬虫程序,以遍历4层链接。我会使用标准的P…

AU 简单混音模板,用于AI换声,简单记录

玩AI换声,记录一下快速入门学到的混音经验 混音成品:【AI绫华/RVC2.0】星之所在 https://www.bilibili.com/video/BV1Ao4y1K7P9 人声轨效果器 多频段压缩器 主要用来控制高频的刺刺声 回声 主要用来使声音更加饱满 自适应降噪 减少毛毛躁躁的噪音&…

chatgpt赋能python:如何在Python中选取列表的某一个元素

如何在Python中选取列表的某一个元素 在Python编程中,经常需要从一个包含多个元素的列表中选取特定的元素,以进行下一步的操作或处理。本文将介绍如何通过索引和切片的方式来选取Python列表中的元素。 什么是Python列表 在Python中,列表&a…

chatgpt赋能python:Python怎么遍历ASCII表?

Python怎么遍历ASCII表? 什么是ASCII表? ASCII表,即美国信息交换标准代码,是最早广泛用于计算机中字符编码的标准之一。它包含128个字符,其中包括大写字母、小写字母、数字、标点符号以及其他特殊字符,如…

机器视觉初步5:图像预处理相关技术与原理简介

在机器视觉领域中,图像预处理是一项非常重要的技术。它是指在对图像进行进一步处理之前,对原始图像进行一系列的操作,以提高图像质量、减少噪声、增强图像特征等目的。本文将介绍一些常用的图像预处理技术,并通过配图说明&#xf…

PHP 课后习题解析与笔记——流程控制语句习题

文章目录 📋前言🎯题目一🎯题目二🎯知识点回顾🧩if...else🧩switch🧩while🧩do...while🧩for🧩foreach 📝最后 📋前言 这篇文章记录一…

chatgpt赋能python:Python如何遍历文件中的数据

Python如何遍历文件中的数据 Python是一种优秀的编程语言,它在数据处理和文件操作方面非常强大。在本篇文章中,我们将讨论如何使用Python遍历文件中的数据。 什么是遍历文件? 在Python中,遍历文件意味着访问文件中的每一行,并…

油气成因现代模式

根据有机质的性质变化和油气生成沉积有机质的成烃演化可划分为三个阶段:成岩作用阶段、深成作用阶段和准变质作用阶段;相应地又按有机质的成熟程度将有机质成烃演化划分为未成熟阶段、成熟阶段和过成熟阶段,镜质体反射率Ro与有机质的成烃作用…

chatgpt赋能python:Python数据分析入门指南

Python数据分析入门指南 Python已成为数据科学和分析中使用最广泛的编程语言之一。在本指南中,我们将介绍如何使用Python进行数据分析并让您快速上手。 数据分析的基础知识 在开始学习Python进行数据分析之前,您需要了解一些基本的数据分析概念&#…

chatgpt赋能python:Python怎么选取不连续的列

Python怎么选取不连续的列 Python是一种流行的编程语言,可供人们进行多种不同的操作,如编写各种应用程序、数据分析、机器学习和Web开发等。对于Python编程人员来说,选取不连续的列是一项常见任务。在本文中,我们将探讨如何使用P…

chatgpt赋能python:Python怎么退出程序:让你轻松掌握退出Python程序的方法

Python怎么退出程序:让你轻松掌握退出Python程序的方法 Python是一种功能强大、易于学习且具有广泛应用的编程语言。在Python开发中,经常需要退出程序,以便在不需要时释放内存和其他资源。那么,Python怎么退出程序?本…

H.264帧结构和RTSP协议源码框架

目录 1、H264编码原理和基本概念 1.1、h.264编码原理 1.2、h.264编码相关的一些概念 2、H264的NAL单元详解 2.1、VCL和NAL的关系 2.2、H.264视频流分析工具 2.3、h264视频流总体分析 2.4、相关概念 3、H264的NAL单元---sps和pps 3.1、sps和pps详解 3.2、H264的profil…