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

文章目录

  • 一、连接查询
    • 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.rhkb.cn/news/432542.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tangle解压玩具商标重复维权,尚未TRO,卖家速查

案件基本情况:起诉时间:2024-9-13案件号:2024-cv-61700品牌:Tangle原告:Tangle Inc.原告律所:Boies Schiller Flexner起诉地:佛罗里达州南部法院涉案商标/版权:原告品牌简介&#xf…

linux远程工具MobaXterm的安装和使用

一、安装和运行 1、下载 地址:(手机夸克转存后下载是对作者最大的支持)https://pan.quark.cn/s/32e1f5e5e95c 2、解压 解压到到常用软件目录下,如C:\Program Files 3、运行 双击MobaXterm_Personal_24.2.exe运行,…

Python 使用selenium 4.25 进行爬虫(1)

都说python做爬虫比较好,于是我跟着大家的脚步学习python进行爬虫,但是调试了半天,出现各种各样的问题,最终都得到实现了,下面我们来看具体的代码: from selenium import webdriver from selenium.webdriv…

【Python报错已解决】TypeError: can only concatenate str (not “int“) to str

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

failed to load steamui.dll的多种处理方法,steamui.dll的作用

在使用Steam平台时,不少玩家可能会遇到“failed to load steamui.dll”这样令人头疼的错误提示。这个错误会阻碍Steam客户端的正常运行,影响我们享受游戏和Steam平台的各种服务。不过,不必过于担心,因为有多种方法可以尝试解决这个…

一招搞定苹果安卓跨系统传输,文件大小再也不是问题

在当今多元化的科技市场中,众多手机品牌竞相推出各自的产品,每个品牌都力图打造独特的用户体验和生态系统。然而,这种品牌之间的多样性也带来了一定的挑战,尤其是在不同品牌体系之间互联互通性方面。由于每个品牌都有自己的操作系…

网站设计中安全方面都需要有哪些考虑

网站设计中的安全性是一个多方面的问题,需要从多个角度进行考虑和实施。以下是一些关键的安全考虑因素: 数据加密: 使用SSL(安全套接字层)证书来建立加密连接,确保数据在传输过程中不被截获。定期更新SSL证…

神经网络(四):UNet图像分割网络

文章目录 一、简介二、网络结构2.1编码器部分2.2解码器部分2.3完整代码 三、实战案例 一、简介 UNet网络是一种用于图像分割的卷积神经网络,其特点是采用了U型网络结构,因此称为UNet。该网络具有编码器和解码器结构,两种结构的功能如下&#…

【第十七章:Sentosa_DSML社区版-机器学习之异常检测】

【第十七章:Sentosa_DSML社区版-机器学习之异常检测】 机器学习异常检测是检测数据集中的异常数据的算子,一种高效的异常检测算法。它和随机森林类似,但每次选择划分属性和划分点(值)时都是随机的,而不是根…

LVS-DR实战案例,实现四层负载均衡

环境准备:三台虚拟机(NET模式或者桥接模式) 192.168.88.200 (web1)(安装nginx服务器作为测试) 192.168.88.201 (服务器)(用于部署lvs-dr) 192.168.88.202 (web2)…

30 | 理论四:如何通过封装、抽象、模块化、中间层等解耦代码?

前面我们讲到,重构可以分为大规模高层重构(简称“大型重构”)和小规模低层次重构(简称“小型重构”)。大型重构是对系统、模块、代码结构、类之间关系等顶层代码设计进行的重构。对于大型重构来说,今天我们…

华为静态路由(route-static)

静态路由的组成 在华为路由器中,使用ip route-static命令配置静态路由。 一条静态路由主要包含以下要素: 目的地址:数据包要到达的目标IP地址 子网掩码:用于指定目的地址的网络部分和主机部分 下一跳地址(可选&#…

linux之mysql安装

1:mysql安装包下载 下载地址 可私信我直接获取安装包 2:linux下wget命令下载 下载地址 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz3:手动安装 将自己的安装包上传到对应的位置 解压 压缩包 使用命令 tar -zxvf mysql-5.7…

Redis面试真题总结(四)

文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ AOF 持久化? AOF(Append Only File&#x…

ubuntu安装emqx

目录 1.预先下载好emqx压缩包 2.使用tar命令解压 3.进入bin目录 5.放开访问端口18083 6.从通过ip地址访问emqx后台 7.默认用户名密码为admin/public 8.登录后台 9.资源包绑定在此博文可自取 1.预先下载好emqx压缩包 2.使用tar命令解压 sudo tar -xzvf emqx-5.0.8-el8-…

精密单轴纵切自动车床

精密单轴纵切自动车床,作为现代机械加工领域的重要设备,以其高精度、高效率的特点,广泛应用于各种精密零件的加工制造中。下面,我将从几个方面来详细解析这种车床的特点和应用。 ‌一、定义与特点‌ ‌精密单轴纵切自动车床‌&…

[笔记]2024大厂变频器,电机参数一览

注意中心高,在用铁心规格,功率换算表 温升曲线在预防性维护过程能用到 注意各类电流参数,上面双极对,下面3极对。 另一种极对数 4极对的电机参数可参考,不常用。 emc滤波, Sto,通讯接口 颜色区分的接口设计 一组新强…

灵当CRM index.php接口SQL注入漏洞复现 [附POC]

文章目录 灵当CRM index.php接口SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 灵当CRM index.php接口SQL注入漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相关技…

1.1.4 计算机网络的分类

按分布范围分类: 广域网(wan) 城域网(man) 局域网(lan) 个域网(pan) 注意:如今局域网几乎采用“以太网技术实现”,因此“以太网”几乎成了“局域…

实景三维夯实数字乡村孪生底座

随着数字乡村建设的不断推进,实景三维技术在乡村规划、管理、服务等方面发挥着越来越重要的作用。本文将探讨实景三维技术如何夯实数字乡村的孪生底座,为乡村的可持续发展提供强有力的支撑。 一、数字乡村建设的背景 数字乡村建设是推动乡村全面振兴、…