MySQL基于成本的优化

news2024/11/24 4:08:11

MySQL的成本是什么?MySQL在执行一个查询的时候,其实是有多种不同的方案的,但是最终会选择一种成本比较低的方案,那么这个成本都体现在什么地方?如何计算?

MySQL的成本

I/O成本 : 把数据从磁盘加入到内存的过程损耗的时间。 读取一个页面花费成本是1

CPU成本  : 读取以及检测结果是否满足对应的搜索条件,对结果集进行排序等操作损耗的时间。读取以及检测一条记录是否符合搜索条件的成本默认是0.2 。

基于成本的优化步骤是什么?

在执行一条查询语句之前,MySQL的查询优化器会找出来该语句使用的索引方案,对比成本之后选出来一个最低的方案,最低成本方案也叫做执行计划。 总结来看,有4步:

1. 根据搜索条件查找所有可能使用的索引

2. 计算全表扫描的代价

3. 计算不同的索引执行查询的代价

4. 对比各种执行方案,找出成本最低的方案

根据搜索条件查找所有可能使用的索引

对于B+树索引来说,只要索引列和常数使用=<=>INNOT INIS NULLIS NOT NULL><>=<=BETWEEN!=(不等于也可以写成<>)或者LIKE操作符连接起来,就可以产生一个所谓的范围区间LIKE匹配字符串前缀也行),也就是说这些搜索条件都可能使用到索引

计算全表扫描的代价

全表扫描的过程是:把聚簇索引中的记录都依次和给定的搜索条件做一下比较,把符合搜索条件的记录加入到结果集中,所以需要将聚簇索引对应页面加载到内存中,然后在对其进行筛选。 查询成本 是 I/O成本 + CPU成本。 

聚簇索引占用的页面数量决定 I/O成本

表中的记录数量决定 CPU成本。 

这两个数量从何而来? MySQL的大佬为每个表维护了一个统计信息,这个数据已经被收集存放好了。 我们直接使命命令查看即可:

SHOW TABLE STATUS LIKE 'single_table'\G

 找到我们关心的参数,Rows 和Data_length ,其中Rows表送的记录数量,是模糊的,大致准确的。 我们重点来看一下Data_length,该参数表示该表占用的存储空间的字节数,对于InnoDB存储引擎来说,该值就是聚簇索引占用的存储空间大小。

Data_length = 聚簇索引的页面数量 * 每个页面的大小

于是我们很容易的就求出来了聚簇索引页面的数量。 

计算不同索引执行查询的代价

MySQL查询优化器会查找到所有可能用到的索引,然后分别计算其成本 。 如果是唯一二级索引的话,会优先分析。 

建表语句

CREATE TABLE single_table (
    id INT NOT NULL AUTO_INCREMENT,
    key1 VARCHAR(100),
    key2 INT,
    key3 VARCHAR(100),
    key_part1 VARCHAR(100),
    key_part2 VARCHAR(100),
    key_part3 VARCHAR(100),
    common_field VARCHAR(100),
    PRIMARY KEY (id),
    KEY idx_key1 (key1),
    UNIQUE KEY idx_key2 (key2),
    KEY idx_key3 (key3),
    KEY idx_key_part(key_part1, key_part2, key_part3)
) Engine=InnoDB CHARSET=utf8;

搜索条件

SELECT * FROM single_table WHERE 
    key1 IN ('a', 'b', 'c') AND 
    key2 > 10 AND key2 < 1000 AND 
    key3 > key2 AND 
    key_part1 LIKE '%hello%' AND
    common_field = '123';

先来分析idx_key2 执行查询的成本分析

 对于二级索引+ 回表的方式,成本依赖于两个方面

一:范围区间的数量。不管该范围的二级索引导致占用了几个页面,默认一个范围和读取一个页面的成本是相同的,都是1 

二:需要回表的记录数。 对于本例子的范围查询,就是要找区间最左记录和区间最右记录,然后即可统计出来符合条件的索引记录条数了,每条记录的成本是0.2 。 这种方式叫做 index dive

三:根据这些记录里面的主键值到聚簇索引中做回表操作。 MySQL默认回表一次的成本和访问一个页的成本一样,都是1 

四:回表操作后得到用户的完整记录,然后再监测其他搜索条件是否成立,每次是0.2 

idx_key1同理,不再赘述

基于索引统计数据的成本计算 适用于什么场景? 是为了解决什么样的问题呢?

SELECT * FROM single_table WHERE key1 IN ('aa1', 'aa2', 'aa3', ... , 'zzz');

上面的查询会产生很多的单点访问区间,我们对每个区间都要去使用index dive 去查询区间最左记录和区间最右记录的话,很耗费性能,MySQL中默认会有一个参数,如果小于这个值,使用index dive查询,如果超过了这个值,就要用到我们上面说的,基于索引统计数据的成本进行估算。 

 这里所说的统计索引数据指的是这两个值:一是使用 SHOW TABLE STATUS 展示出的Rows 值,也就是一个表中有多少记录。 二是上面表格中的Cardinality 。 两者结合,可以计算出索引列中的值一个平均出现X次。 

假设上面的查询语句有20000个参数,那成本就是20000 *  X。 很明显,没有index dive准确。

连接查询的成本

上面说的,都是单表查询的成本,接下来我们看一下连接查询的成本。

根据之前的知识,MySQL连接查询采用的是循环嵌套连接算法,驱动表被访问一次,被驱动表被访问多次,所以查询的成本就是两个部分构成:一是单次查询驱动表的成本; 二是多次查询被驱动表的成本。  驱动表进行查询之后得到的记录条数称为被驱动表的扇出。 

两表连接的计算成本是:单次访问驱动表的成本 + 驱动表扇出数量 * 单次访问被驱动表的成本

对于外连接来说,驱动表是固定的,所以只用分别为驱动表和被驱动表选择成本最低的访问方法。

对于内连接来说,多了一步,不同的表作为驱动表最终查询的成本是不一样的,需要考虑最优的表的链接顺序。 然后分别为驱动表和被驱动表选择成本最低的访问方法。 

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

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

相关文章

Python 萌新 - 花10分钟学爬虫

前言 Python 新手入门很多时候都会写个爬虫练手&#xff0c;本教程使用 Scrapy 框架&#xff0c;帮你简单快速实现爬虫&#xff0c;并将数据保存至数据库。在机器学习中数据挖掘也是十分重要的&#xff0c;我的数据科学老师曾经说过&#xff0c;好算法不如好数据。 Python助学…

理光打印机连接电脑后不打印的原因及解决方法

理光打印机在使用时&#xff0c;可能会出现正常连接上理光打印机却没有反应的情况&#xff0c;出现无法打印的情况&#xff0c;下面&#xff0c;驱动人生为大家带来理光打印机连接后不打印的解决方案。 驱动人生分析&#xff0c;一般遇到理光打印机连接后不打印的情况&#xf…

第一行代码 第十一章 基于位置的服务

第11章 基于位置的服务 在本章中&#xff0c;我们将要学习一些全新的Android技术&#xff0c;这些技术有别于传统的PC或Web领域的应用技术&#xff0c;是只有在移动设备上才能实现的。 基于位置的服务&#xff08;Location Based Service&#xff09;。由于移动设备相比于电脑…

Prompt Engineering | 编写prompt的原则与策略

&#x1f604; 为了更好地与大模型&#xff08;e.g. chatgpt&#xff09;更好的交流&#xff0c;一起来学习如何写prompt吧&#xff01;&#x1f604; 文章目录 1、简介2、编写prompt的原则与策略2.1、编写清晰、具体的指令2.1.1、策略一&#xff1a;使用分隔符清晰地表示输入的…

js 解析map (处理后端返回对象拼接)

返回的数据 需要的展示效果 解析如下&#xff1a; { title: ‘销售属性’, align: ‘left’, dataIndex: ‘xsshuxing’, width: 200, render(value, record) { let keyValue ‘’; { for (var key in record.otherAttr) { console.log(‘属性&#xff1a;’ key ‘,值&…

EIS-Net

我们提出了一种新的领域泛化框架&#xff08;称为EISNet&#xff09;&#xff0c;该框架利用来自多源领域图像的外在关系监督和内在自我监督学习&#xff0c;学习如何同时在不同领域中进行泛化。 具体而言&#xff0c;我们采用多任务学习范式&#xff0c;通过特征嵌入来构建我…

AI智慧安监视频平台EasyCVR视频出现不能播放的情况排查与解决

EasyCVR基于云边端协同&#xff0c;可支持海量视频的轻量化接入与汇聚管理。平台兼容性强、拓展度高&#xff0c;可提供视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、H.265自动转码、平台级联等功能。 有用户反…

如何动态生成列表视图?

UE5 插件开发指南 前言0 什么是列表视图?1 如何动态生成?1.0 指定ListView生成的条目前言 这里将其拆分成两个问题来分析: (1)什么是列表视图? (2)如何动态生成? 0 什么是列表视图? 列表视图就是用来展示一系列对象的UI列表,在UE编辑器的UserWidget设计窗口中可以找到…

linux 安装 ffmpeg

linux 安装 ffmpeg windows上安装&#xff0c;直接下载压缩包解压。linux安装&#xff0c;找了半天各种技术文章&#xff0c;说最好编译安装&#xff0c;按照步骤安装编译环境编译成功了&#xff0c;但是使用的时候总要安装各种外部库&#xff0c;转码转不了等等问题...... 最…

城市生命线监测系统包括哪些内容?

城市排水、供水、燃气、供热、桥梁、隧道、综合管廊等基础设施是城市正常运转的基石&#xff0c;被称为“城市生命线”。城市生命线一旦出现故障或事故&#xff0c;将会给城市和居民带来巨大的经济和生活损失。通过对城市生命线的实时监测和预警&#xff0c;可以及时发现潜在的…

第十五届“中国电机工程学会杯”数学建模竞赛

第十五届电工杯5月26号就要开始啦&#xff0c;今天给大家回顾第十四届全国大学生电工数学建模竞赛A题&#xff0c;主要从赛题重述和问题分析与代码实战展开。第十五届全国大学生电工数学建模竞赛已经开始报名了哦&#xff0c;后续我也会分享对应的建模思路哦&#xff0c;大家记…

Leetcode452. 用最少数量的箭引爆气球

Every day a Leetcode 题目来源&#xff1a;452. 用最少数量的箭引爆气球 解法1&#xff1a;排序 贪心 题解&#xff1a;用最少数量的箭引爆气球 我们首先随机地射出一支箭&#xff0c;再看一看是否能够调整这支箭地射出位置&#xff0c;使得我们可以引爆更多数目的气球。…

CVPR论文解读 | 点云匹配的旋转不变变压器

原创 | 文 BFT机器人 传统的手工特征描述符通常具有内在的旋转不变性&#xff0c;但是最近的深度匹配器通常通过数据增强来获得旋转不变性。 然而&#xff0c;由于增强旋转数量有限&#xff0c;无法覆盖连续SO&#xff08;3&#xff09;空间中所有可能的旋转&#xff0c;因此这…

VC6.0的工程设置解读Project--Settings

做开发差不多一年多了&#xff0c;突然感觉对VC的工程设置都不是很清楚&#xff0c;天天要和VC见面&#xff0c;虽然通常情况下一般都不会修改工程设置&#xff0c;但是还是有必要对它的一些设置项的来龙去脉有一定的了解&#xff0c;所以狂查资料&#xff0c;稍作整理&#xf…

(仿真)创建 URDF 机器人模(1)

继上一篇基础篇的结束&#xff0c;不用看以前的也可以&#xff0c;这里是不受前面的影响的。 如果你没有这个目录&#xff0c;就创建一个catkin_ws文件夹 然后里面再一个src文件夹就ok了&#xff0c;我在基础篇第一篇的时候就有这个文件夹了&#xff0c;所有我现在是直接进入 …

【 计算机组成原理 】第七章 外围设备

系列文章目录 第一章 计算系统概论 第二章 运算方法和运算器 第三章 多层次的存储器 第四章 指令系统 第五章 中央处理器 第六章 总线系统 第七章 外围设备 第八章 输入输出系统 文章目录 系列文章目录前言第七章 外围设备7.1 外围设备概述7.1.1 外围设备的一般功能7.1.2 外围…

zabbix安装部署、三分钟分钟部署zabbix监控(超详细)

zabbix安装部署 1&#xff0c;快速安装部署zabbix2&#xff0c;一键脚本安装zabbix 1&#xff0c;快速安装部署zabbix 1&#xff0c;关闭防火墙&#xff0c;selinux systemctl stop firewalld systemctl disable firewalld setenforce 0 #临时 sed -i s/SELINUXenforcing/SE…

运维宝典大全

运维宝典大全 网络拓展Linux 概述什么是LinuxUnix和Linux有什么区别&#xff1f;什么是 Linux 内核&#xff1f;Linux的基本组件是什么&#xff1f;Linux 的体系结构BASH和DOS之间的基本区别是什么&#xff1f;Linux 开机启动过程&#xff1f;Linux系统缺省的运行级别&#xff…

Jmeter性能测试 -3 Jmeter使用中的一些问题

请求内容出现乱码的处理方法 1 内容编码&#xff1a;utf-8 2 请求头添加编码 Content-Type: application/json;charsetutf-8 3 请求体为参数类型时&#xff0c;勾选参数“编码”&#xff0c;编码为urlencoded编码。当参数值为非字符&#xff08;汉字、特殊符号&#xff09;时…

全面了解Java连接MySQL的基础知识,快速实现数据交互

全面了解Java连接MySQL的基础知识&#xff0c;快速实现数据交互 1. 数据库的重要性2. MySQL数据库简介2.1 MySQL数据库的基本概念2.2 MySQL的基本组成部分包括服务器、客户端和存储引擎。2.3 安装MySQL数据库2.3.1安装MySQL数据库2.3.2 下载MySQL安装程序2.3.3 运行MySQL安装程…