MySQL连接查询解析与性能优化成本

news2024/12/24 8:31:10

文章目录

  • 一、连接查询
    • 1.连接查询基础
      • 1. INNER JOIN内连接
      • 2. LEFT JOIN (或 LEFT OUTER JOIN)左外连接
      • 3. RIGHT JOIN (或 RIGHT OUTER JOIN)右外连接
      • 4. FULL OUTER JOIN
    • 2.连接查询的两种过滤条件
    • 3.连接的原理
  • 二、性能优化成本
    • 1.基于成本的优化
    • 2.调节成本常数
      • (1)mysql.server_cost表
      • (2)mysql.engine_cost表

一、连接查询

1.连接查询基础

MySQL中的连接查询(JOIN)是用于从两个或多个表中检索数据的一种方法。当需要组合来自不同表的信息时,通常会使用连接查询。MySQL支持多种类型的JOIN,包括INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN等。

1. INNER JOIN内连接

INNER JOIN是最常用的连接类型,它返回两个表中满足连接条件的所有行。如果某一行在另一个表中没有匹配,则不会出现在结果集中。

示例:
假设我们有两个表,一个是employees(员工表),另一个是departments(部门表)。我们想要找出所有员工及其对应的部门名称。

SELECT employees.name, departments.department_name
FROM employees
INNER JOIN departments 
ON employees.department_id = departments.id;

2. LEFT JOIN (或 LEFT OUTER JOIN)左外连接

LEFT JOIN返回左表(FROM子句中提到的第一个表)中的所有记录,即使右表中没有匹配的记录。如果右表中没有匹配的记录,那么结果集中的对应列将包含NULL值。

示例:
如果我们想列出所有的员工以及他们所在的部门,即使有些员工还没有分配到任何部门,也可以使用LEFT JOIN。

SELECT employees.name, departments.department_name
FROM employees
LEFT JOIN departments 
ON employees.department_id = departments.id;

3. RIGHT JOIN (或 RIGHT OUTER JOIN)右外连接

RIGHT JOINLEFT JOIN相反,它返回右表中的所有记录,即使左表中没有匹配的记录。如果左表中没有匹配的记录,那么结果集中的对应列将包含NULL值。

示例:
如果我们想列出所有部门及其中的员工,即使有些部门目前没有员工,可以使用RIGHT JOIN。

SELECT employees.name, departments.department_name
FROM employees
RIGHT JOIN departments 
ON employees.department_id = departments.id;

4. FULL OUTER JOIN

FULL OUTER JOIN返回左表和右表中的所有记录。当某一行在其中一个表中没有匹配时,结果集中的对应列将包含NULL值。但是需要注意的是,MySQL本身并不直接支持FULL OUTER JOIN,可以通过UNION操作来模拟实现。

示例:
为了得到一个包含所有员工和部门的列表,无论是否有对应的匹配项,可以这样做:

SELECT employees.name, departments.department_name
FROM employees
LEFT JOIN departments 
ON employees.department_id = departments.id
UNION
SELECT employees.name, departments.department_name
FROM employees
RIGHT JOIN departments 
ON employees.department_id = departments.id;
  • 在使用JOIN时,确保连接条件是正确的,以避免产生过多的笛卡尔积(即每个表的每一行都与其他表的每一行配对)。
  • 当处理大型数据集时,考虑使用索引来提高性能。
  • 对于复杂的查询,可能需要使用子查询、视图或其他高级技术来优化性能和可读性。

2.连接查询的两种过滤条件

  • WHERE子句中的过滤条件:

WHERE子句中的过滤条件就是我们平时见的那种,不论是内连接还是外连接,凡是不符合WHERE子句中的过滤条件的记录都不会被加入最后的结果集。

  • ON子句中的过滤条件:

对于外连接的驱动表(即,left join中左边的表,或right join中右边的表)的记录来说,如果无法在被驱动表中找到匹配ON子句中的过滤条件的记录,那么该记录仍然会被加入到结果集中,对应的被驱动表记录的各个字段使用NULL值填充。

如果把ON子句放到内连接中,MySQL会把它和WHERE子句一样对待。

一般情况下,我们都把只涉及单表的过滤条件放到WHERE子句中,把涉及两表的过滤条件都放到ON子句中。

3.连接的原理

在执行连接查询语句时,大致会经历以下两个步骤:

  • 步骤1:选取驱动表,使用与驱动表相关的过滤条件,选取代价最低的单表访问方法来执行对驱动表的单表查询。

  • 步骤2:对上一步骤中查询驱动表得到的结果集中每一条记录,都分别到被驱动表中查找匹配的记录。

驱动表只访问一次(步骤1),但被驱动表却可能被多次访问(步骤2)。无论是步骤1还是步骤2都可以利用索引来加快查询速度。

二、性能优化成本

相信大家都经常听说数据库优化这词,所以,数据库的优化是针对什么进行优化呢?这就不得不提到MySQL的优化成本了:

  • I/O成本:

我们的表经常使用的MyISAM、InnoDB存储引擎都是将数据和索引都存储到磁盘上的,当我们想查询表中的记录时,需要先把数据或者索引加载到内存中然后再操作。这个从磁盘到内存这个加载的过程损耗的时间称之为I/O成本。

  • CPU成本:

读取以及检测记录是否满足对应的搜索条件、对结果集进行排序等这些操作损耗的时间称之为CPU成本。

对于InnoDB存储引擎来说,页是磁盘和内存之间交互的基本单位,MySQL的设计者规定读取一个页面花费的成本默认是1.0,读取以及检测一条记录是否符合搜索条件的成本默认是0.2。1.0、0.2这些数字称之为成本常数。

1.基于成本的优化

在MySQL中,性能优化都是花费尽可能少的成本来达到检索目标的,大致是这么一个过程:

  • 根据搜索条件,找出所有可能使用的索引;
  • 计算全表扫描的代价;
  • 计算使用不同索引执行查询的代价;
  • 对比各种执行方案的代价,找出成本最低的那一个。

2.调节成本常数

MySQL将成本常数存储到了mysql数据库(系统数据库)中的两个表中,一个叫engine_cost,存储的是存储引擎的成本常数;另一个叫server_cost,存储的是MySQL server端的成本常数。

在server层进行连接管理、查询缓存、语法解析、查询优化等操作,在存储引擎层执行具体的数据存取操作。也就是说一条语句在server层中执行的成本是和它操作的表使用的存储引擎是没关系的,所以关于这些操作对应的成本常数就存储在了server_cost表中,而依赖于存储引擎的一些操作对应的成本常数就存储在了engine_cost表中。

(1)mysql.server_cost表

server_cost表中在server层进行的一些操作对应的成本常数,具体内容如下:

在这里插入图片描述

  • 列的说明:

    • cost_name:表示成本常数的名称。
    • cost_value:表示成本常数对应的值。如果该列的值为NULL的话,意味着对应的成本常数会采用默认值。
    • last_update:表示最后更新记录的时间。
    • comment:注释。
  • 成本常量说明:

  • disk_temptable_create_cost:默认值是40.0,创建基于磁盘的临时表的成本,如果增大这个值的话会让优化器尽量少的创建基于磁盘的临时表。

  • disk_temptable_row_cost:默认值是1.0,向基于磁盘的临时表写入或读取一条记录的成本,如果增大这个值的话会让优化器尽量少的创建基于磁盘的临时表。

  • key_compare_cost:默认值是0.1,两条记录做比较操作的成本,多用在排序操作上,如果增大这个值的话会提升filesort的成本,让优化器可能更倾向于使用索引完成排序而不是filesort。

在MySQL中,FileSort 是一个排序算法,用于处理那些无法通过索引直接完成排序的查询。当MySQL执行一个查询并需要根据某些字段对结果进行排序时,如果这些字段上没有合适的索引,或者查询的复杂度导致MySQL决定不使用现有索引,MySQL就会使用 FileSort 方法来对结果集进行排序。
算法一——内存排序:MySQL首先尝试在内存中对数据进行排序。如果排序的数据量较小,可以完全放入内存中,MySQL会在内存中完成排序操作。MySQL使用一个称为“sort buffer”的内存区域来存储待排序的数据。
算法二——磁盘排序:如果数据量过大,超出了可用的内存大小,MySQL会将部分数据写入临时文件,并在磁盘上进行排序。这种情况下,MySQL会创建多个临时文件,每个文件中包含一部分排序后的数据。最后,MySQL会将这些临时文件合并成一个最终的排序结果。
识别FileSort:在执行 EXPLAIN 命令时,如果看到 Extra 列中有 Using filesort,这表明MySQL正在使用 FileSort 来对结果集进行排序。

  • memory_temptable_create_cost :默认2.0,创建基于内存的临时表的成本,如果增大这个值的话会让优化器尽量少的创建基于内存的临时表。
  • memory_temptable_row_cost:默认0.2,向基于内存的临时表写入或读取一条记录的成本,如果增大这个值的话会让优化器尽量少的创建基于内存的临时表。
  • row_evaluate_cost:默认0.2,检测一条记录是否符合搜索条件的成本,增大这个值可能让优化器更倾向于使用索引而不是直接全表扫描。

MySQL在执行诸如DISTINCT查询、分组查询、Union查询以及某些特殊条件下的排序查询都可能在内部先创建一个临时表,使用这个临时表来辅助完成查询(比如对于DISTINCT查询可以建一个带有UNIQUE索引的临时表,直接把需要去重的记录插入到这个临时表中,插入完成之后的记录就是结果集了)。在数据量大的情况下可能创建基于磁盘的临时表,也就是为该临时表使用MyISAM、InnoDB等存储引擎,在数据量不大时可能创建基于内存的临时表,也就是使用Memory存储引擎。

(2)mysql.engine_cost表

在这里插入图片描述

  • engine_name列:指成本常数适用的存储引擎名称。如果该值为default,意味着对应的成本常数适用于所有的存储引擎。

  • device_type列:指存储引擎使用的设备类型,这主要是为了区分常规的机械硬盘和固态硬盘,不过在MySQL 5.7.21这个版本中并没有对机械硬盘的成本和固态硬盘的成本作区分,所以该值默认是0。

  • 成本常量说明:

io_block_read_cost:默认值1.0,从磁盘上读取一个块对应的成本。对于InnoDB存储引擎来说,一个页就是一个块,不过对于MyISAM存储引擎来说,默认是以4096字节作为一个块的。增大这个值会加重I/O成本,可能让优化器更倾向于选择使用索引执行查询而不是执行全表扫描。
memory_block_read_cost:默认值1.0,与上一个参数类似,只不过衡量的是从内存中读取一个块对应的成本。

当我们想要通过调整成本常量值来优化MySQL性能时,可以根据业务需求来调整mysql.engine_cost和mysql.server_cost中的成本常量值。

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

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

相关文章

ECharts基础使用方法 ---vue

1.安装依赖文件 仔细看项目" README.md " 描述,确定用什么安装 npm npm install echarts --save //官网推荐使用 pnpm pnpm install echarts --save 其他也是 在项目根目录,打开当前目录命令控制栏,输入以上命令并运行 安装成功后…

动动手指探索世界,旅游APP如何定制开发?

旅游APP的出现为旅行带来了许多便利。随着移动互联网的发展,旅游行业也在不断寻求创新与变革。旅游APP为游客提供了更加便捷的旅行体验,通过旅游APP,用户可以了解旅游信息、旅游服务、在线咨询等,实现在线一站式解决旅行需求的目标…

Github 2024-09-23 开源项目周报 Top15

根据Github Trendings的统计,本周(2024-09-23统计)共有15个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目6C++项目3C项目3HTML项目2PowerShell项目1TypeScript项目1JavaScript项目1Blade项目1PHP项目1Bootstrap 5: Web上开发响应式、移动优…

【文心智能体】 旅游手绘手帐 开发分享 零代码 手绘风景 记录行程和心情 旅游攻略

旅游手绘手帐,点击文心智能体平台AgentBuilder | 想象即现实 (baidu.com) 目录 背景 创作灵感 开发历程 一、基础配置 二、高级配置 三、引导示例(提示词) 期待优化 背景 这个智能体是一个零代码智能体(文心智能体平台现…

MySQL篇(管理工具)

目录 一、系统数据库 二、常用工具 1. mysql 2. mysqladmin 3. mysqlbinlog 4. mysqlshow 5. mysqldump 6. mysqlimport/source 6.1 mysqlimport 6.2 source 一、系统数据库 MySQL数据库安装完成后,自带了一下四个数据库,具体作用如下&#xf…

JDBC和一下重要的jar包,分层结构

系列文章目录 JDBC和方便使用的jar包 目录 系列文章目录 文章目录 一、JDBC 1.步骤 2.SQL注入 3.SQL注入解决(PreparedStatement) 4.批处理和事务控制 5.连接池 Druid连接池(德鲁伊) 6.封装为工具类 7.ThreadLocal 、小秘书 二、…

大语言模型(LLM)入门学习路线图

Github项目上有一个大语言模型学习路线笔记,它全面涵盖了大语言模型的所需的基础知识学习,LLM前沿算法和架构,以及如何将大语言模型进行工程化实践。这份资料是初学者或有一定基础的开发/算法人员入门活深入大型语言模型学习的优秀参考。这份…

【FPGA】FPGA芯片结构

目录 1 可编程输出/输出单元(IOB)2 可配置逻辑块(CLB)3 数字时钟管理模块(DCM)4 嵌入式块存储器(BRAM)5 布线资源6 内嵌功能模块(专用IP单元)6.1 PLL&#xf…

SpringBoot简易商品管理系统

> 这是一个基于SpringBootThymeleaf实现的简易商品管理系统。 > 包含基本的登录/注册与商品管理功能。 > 界面简洁美观,代码结构清晰,适用于JAVA初学者在此基础上进行二次开发。 一、项目演示 二、技术框架 框架描述Spring Boot容器管理 S…

CV之OCR:GOT-OCR2.0的简介、安装和使用方法、案例应用之详细攻略

CV之OCR:GOT-OCR2.0的简介、安装和使用方法、案例应用之详细攻略 目录 GOT-OCR2.0的简介 1、更新 GOT-OCR2.0的安装和使用方法 1、安装 安装环境cuda11.8torch2.0.1 安装包 安装Flash-Attention GOT权重:1.43G 2、演示 3、训练 4、评估 GOT-…

Tomcat靶场攻略

一.CVE-2017-12615 1.首页抓包,修改为 PUT 方式提交 ,将jsp木马写到数据包中 2.哥斯拉默认秘钥连接 二.后台弱⼝令部署war包 1.制作WAR包,上传 将JSP⽊⻢压缩为ZIP格式,然后修改后缀为war 2.文件上传成功后,默认会在网站根目录下生成和wa…

使用centos7搭建wiki论坛,使用nginx网站来搭建wiki负载均衡,反向代理。

1.安装一个wget,进入目录opt下 #安装wget yum -y install wget#进入目录/opt/下面 cd /opt/2.获取 mysql8.0 rpm包,安装mysql8.0,安装mysql-server,yum会自动下载所需安装及依赖包. #获取 mysql8.0 rpm包 wget https://dev.mysql.com/get/mysql80-comm…

2024人工智能结课作业-DFS/BFS/Astar解决数码问题

1 深度优先遍历搜索(DFS) 1.1算法介绍 深度优先搜索算法(Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发…

基于SSM的“在线CRM管理系统”的设计与实现(源码+数据库+文档+开题报告)

基于SSM的“在线CRM管理系统”的设计与实现(源码数据库文档开题报告) 开发语言:Java 数据库:MySQL 技术:SSM 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 总体功能模块图 登录页面 后台管理页面 产品信息页面 客…

【Android】BottomSheet基本用法总结(BottomSheetDialog,BottomSheetDialogFragment)

BottomSheet BottomSheet 是一种位于屏幕底部的面板,用于显示附加内容或选项。提供了从屏幕底部向上滑动显示内容的交互方式。这种设计模式在 Material Design 中被广泛推荐,因为它可以提供一种优雅且不干扰主屏幕内容的方式来展示额外信息或操作。 具体…

大型综合医院供配电系统设计

摘要:众所周知,医院供配电系统关系着整个医院的正常运行,一旦出现故障将会对病患的安全造成威胁。基于此,本文就大型综合医院供配电系统设计进行深入探讨,以期为其他类似医院建筑供配电系统设计提供借鉴。 关键词&…

代理模式详解:控制对象访问的利器

代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。代理模式通常用于延迟对象的创建、控制对对象的访问或在访问对象时添加一些额外的操作。 代理模式通过引入一个代理对象来控制对目标对象的访…

超详细超实用!!!AI编程之cursor配置中文(一)

云风网 云风笔记 云风知识库 一、配置中文扩展 打开扩展,搜索chinese,安装chinese(simplified) 简体中文语言包,重启即可 二、配置中文方法二 使用快捷键组合【CtrlShiftp】,在搜索框中输入configure display language,选择中文也可配置中文 三、配置…

九、成功版--windows上安装artifactory配置postgressql

centos上搞不定,windows上搞定了 现阶段是想用java写程序控制制品库,等以后研究多了需要写一些脚本的时候,在研究linux上安装artifactory(公司就用的linux安装的配置mysql,有空对着配一下linux的) 源码地…

【实证数据】国家信息消费试点城市(2000年-2023年)

数据说明:2013年,国务院发布《促进信息消费若干意见》,旨在激发需求、拓宽市场及丰富服务内容。随后,工信部启动信息消费试点城市建设,分两批确立104个试点区域,旨在通过试点引领,促进信息消费增…