第12章 谁最便宜就选谁——MySQL基于成本的优化

news2024/11/15 13:02:17

12.1 什么是成本

  1. I/O 成本

    当我们想查询表中的记录时,需要先把数据或者索引从磁盘加载到内存中再操作。

  2. CPU 成本

    读取以及检测记录是否满足对应的搜索条件、对结构集进行排序等这些操作损耗。

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

12.2 单表查询的成本

12.2.1 准备工作

建表并插入数据,即前面用过的 single_table

12.2.2 基本成本的优化步骤

MySQL 的查询优化器会找出执行 SQL 的所有可能方案,对比之后给出成本最低的方案,就是所谓的执行计划

  1. 根据索引条件,找出所有可能使用的索引
  2. 计算全表扫描的成本
  3. 计算使用不同索引执行查询的成本
  4. 对比各种执行方案的成本,使用成本最低的那一个
12.2.3 基于索引统计数据的成本计算

查询有时会出现许多单点区间的情况,比如:

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

由于idx_key1不是唯一索引,所以并不能确定一个单点区间对应的二级索引记录的条数有多少,只能找到对应的区间。然后再计算区间内有多少数据。这种通过直接访问索引对应的B+树来计算某个范围区间对应的索引记录条数的方式称为index dive

SHOW VARIABLES LIKE '%dive%';

在这里插入图片描述

当 IN 语句中的参数个数小于200时,将使用 index dive 的方式计算各个单点区间对应的记录条数;否则就需要使用索引统计数据来进行估计决定是否使用 index dive 了。

SHOW INDEX FROM single_table;

在这里插入图片描述

属性名描述
Table索引所属的表名
Non_unique是否唯一索引,0:是;1:否
Key_name索引名
Seq_in_index索引列在索引中的位置,从1开始
Column_name索引列名
Collation排序方式,A:升序;NULL:降序
Cardinality索引列中不重复值的数量(估算值)
Sub_part对字符串或字节串的对n位建立索引时,Sub_part=n,对完整列建立索引时为NULL
Packed索引列如何被压缩,NULL表示未压缩
NULL是否允许存储NULL值
Index_type索引的类型,BTREE
Comment索引列注释信息
Index_comment索引注释信息

针对索引列,计算出一个值平均的出现次数:

N = Rows ÷ Cardinality

假设 IN 语句中有200个参数,则可能的回表记录数有:

C = 200 × N

12.3 连接查询的成本

12.3.1 准备工作

new single_table2 = single_table

12.3.2 Condition filtering 介绍

两表连接查询的成本:

  1. 单次查询驱动表的成本
  2. 多次查询被驱动表的成本

扇出:驱动表进行查询后得到的记录条数

condition filtering 过程:

  1. 如果使用的是全表扫描的方式执行的单表查询,那么计算驱动表扇出时需要猜满足搜索条件的记录到底有多少。
  2. 如果使用的是索引执行的单表扫描,那么计算驱动表扇出的时候需要猜满足除使用到对应索引的搜索条件外的其他搜索条件的记录有多少条。
12.3.3 两表连接的成本分析

连接查询的成本公式:

连接查询总成本 = 单次访问驱动表的成本 + 驱动表扇出数 × 单次访问被驱动表的成本

12.3.4 多表连接的成本分析

系统变量 optimizer_search_depth

系统变量 optimizer_prune_level

12.4 调节成本常数

SHOW TABLES FROM mysql LIKE '%cost%';

在这里插入图片描述

一条语句的执行分为两层:

  1. server 层:连接管理、查询缓存、语法解析、查询优化
  2. 存储引擎层:具体的数据存取
12.4.1 mysql.server_cost 表
SELECT * FROM mysql.server_cost;

在这里插入图片描述

列名含义
cost_name成本常数名称
cost_value成本常数对应的值。NULL表示采用默认值
last_update最后更新记录的时候
comment注释
default_value默认值
成本常数名称默认值描述
disk_temptable_create_cost20创建基于磁盘的临时表的成本,如果增大这个值会让优化器尽量少地创建基于磁盘的临时表
disk_temptable_row_cost0.5向基于磁盘的临时表写入或读取一条记录的成本,如果增大这个值会让优化器尽量少地创建基于磁盘的临时表
key_compare_cost0.05两条记录做比较操作的成本
memory_temptable_create_cost1创建基于内存的临时表的成本,如果增大这个值会让优化器尽量少地创建基于内存的临时表
memory_temptable_row_cost0.1向基于内存的临时表写入或读取一条记录的成本,如果增大这个值会让优化器尽量少地创建基于内存的临时表
row_evaluate_cost0.1检测一条记录是否符合搜索条件的成本,增大这个值可能让优化器更倾向于使用索引而不是直接全表扫描

TIPS:

MySQL 在执行诸如 DISTINCT、GROUP BY、UNION 及某些特殊条件的排序查询时都可能在内部先创建一个临时表。在数据量大的情况下可能创建基于磁盘的临时表,否则创建基于内存的临时表。

UPDATE mysql.server_cost
SET cost_value = 0.4
WHERE cost_name = 'row_evaluate_cost'

FLUSH OPTIMIZER_COSTS;
12.4.2 mysql.engine_cost 表
SELECT * FROM mysql.engine_cost;

在这里插入图片描述

列名含义
engine_name成本常数适用的存储引擎名称,default 表示该常数适用于所有存储引擎
device_type存储引擎使用的设备类型,主要为了区分机械硬盘和固态硬盘
成本常数名称默认值描述
io_block_read_cost1从磁盘上读取一个的成本。对于 InnoDB 而言,块就是页;对于MyISAM 而言,默认以 4096 字节作为一个块。增大这个值会加重 I/O 成本,可能让优化器更倾向于选择使用索引 执行查询而不是执行全表扫描。
memory_block_read_cost0.25从内存中读取一个块的成本。
INSERT INTO mysql.engine_cost
VALUES ('InnoDB', 0, 'io_block_read_cost', 2.0,
CURRENT_TIMESTAMP, 'increase Innodb I/O cost');

FLUSH OPTIMIZER_COSTS;

12.5 总结

  1. 一个查询的执行成本包括 I/O 成本和 CPU 成本,对于 InnoDB 来说,读取一个页面的 I/O 成本默认是 1.0,读取以及检测一条记录是否符合搜索条件的成本默认是 0.2。
  2. 可以通过手动修改 mysql 数据库下 engine_cost 表或者 server_cost 表中的某些成本常数,更精确的控制生成执行计划时的成本计算。

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

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

相关文章

《AI 大模型进阶指南:零基础迈向精通,看这一篇足矣!》

一、初聊大模型 (一)为什么要学习大模型? 在当今这个快速变化的时代,新技术和概念不断涌现,大模型因其强大的功能和广泛的应用而备受推崇。在学习大模型之前,不必担忧自身缺乏相关知识或觉得其难度过高。…

Finalshell上传文件失败或者进度总为百分之零解决

1.点击复制标签 2.关闭原标签后即可顺利上传 3.如果还是不行,则用chmod 777 文件路径,改变文件的权限

物联网控制箱

随着科技的飞速发展,物联网(Internet of Things, IoT)技术已经深入我们生活的方方面面,从智能家居到智慧城市,从工业制造到农业管理,物联网正以前所未有的方式改变着世界。唯众的物联网控制箱正是这一趋势下…

技术分享-商城篇-优惠券管理-功能介绍及种类(二十四)

前言 在前面文章中,我们聊到了商城的基础架构和基础功能,它们是构建商城体系的底座,是基础,没有构建出基础,是无法打造高楼大厦的,但是我们在做完基础之后,还得继续深挖其他的功能,…

QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第二期]

QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第二期] 第二期介绍:频道模块之频道管理 目录 QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第二期]第二期介绍:频道模块之频道管理获取用户详情获取用户频道列表获取频道详情获取子频道列表获…

❤ Node05-增删改查接口优化

❤ Node05-增删改查接口优化 1、优化用户查询接口,根据用户条件查询我们的列表 ​ 先拿sql数据命令试试 SELECT * FROM user WHERE name san娟; 我们的查询命令没问题,接下来把我们的传入的活数据给传入进去即可 (1)传入查询…

游泳馆押金管理+手牌管理+刷手牌 开通方法

一、游泳馆手牌押金管理 1. 减少手牌丢失:收取押金可以让顾客更加谨慎地保管手牌,降低手牌丢失的概率。 2. 保障设施安全:有助于防止顾客对手牌的不当使用或故意破坏,保护游泳馆的设施和资源。 3. 规范顾客行为:促使…

Flutter Button使用

Material 组件库中有多种按钮组件如ElevatedButton、TextButton、OutlineButton等,它们的父类是于ButtonStyleButton。 基本的按钮特点: 1.按下时都会有“水波文动画”。 2.onPressed属性设置点击回调,如果不提供该回调则按钮会处于禁…

从戴尔公司中国大饭店DTF大会,看科技外企如何在中国市场发展

【科技明说 | 科技热点关注】 2024戴尔科技峰会在8月如期举行,虽然因事未能抵达现场参加,我只是观看了网上在线直播,也未能采访到DTF现场重要与会者,但是通过数十年对戴尔的跟踪与观察,我觉得2024戴尔科技…

哈希签名溯源--Lamport40签名算法

背景 哈希签名是指只依赖哈希函数的数字签名算法(而非某个数学问题,例如ECC的离散对数问题、RSA的大整数因式分解)。这类算法一直不是主流,但随着量子计算机及其配套算法(舒尔算法)的出现,ECC和…

kubeadm 初始化 k8s 证书过期解决方案

概述 在使用 kubeadm 初始化的 Kubernetes 集群中,默认情况下证书的有效期为一年。当证书过期时,集群中的某些组件可能会停止工作,导致集群不可用。本文将详细介绍如何解决 kubeadm 初始化的 Kubernetes 集群证书过期的问题,并提…

ETF全量后复权数据更新与一个限时免费的星球

原创第645篇 | AI量化实验室 AI量化实验室星球本周计划: 1、“七天入门量化投资”专栏更新完成第三天和第四天。 2、lightgbm为代表的机器学习因子合成与stockranker实现。 3、etf全量数据更新到最新。 class ETFQuotes(Quotes):def __init__(self, tb_basiebasi…

MySQL:运维管理-主从复制

目录 一、主从复制的概述二、主从复制的工作原理三、搭建主从复制的结构3.1 环境准备3.2 搭建配置(主库配置)3.3 搭建配置(从库配置)3.4 测试 一、主从复制的概述 主从复制是指将主数据库中的DDL和DML操作的二进制文件保存到本地&…

通义千问更新数学大模型及视觉多模态

Qwen2-Math,这是通义千问专门为数学场景优化的模型,其数学能力指标甚至超越了GPT4o, Claude3.5 Sonnet, Deepseek Coder等顶流模型,目前从指标来看是最强的数学模型。目前是免费供应,大家碰到数学问题可以选择使用这个模型。 Qw…

[数据集][图像分类]嘴巴张开闭合分类数据集6397长2类别

数据集类型:图像分类用,不可用于目标检测无标注文件 数据集格式:仅仅包含jpg图片,每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数):6397 分类类别数:2 类别名称:["close","open&qu…

linux安装redis、使用redis、用springboot连接redis

安装redis 解压redis的tar包 tar -vsxf 包名 解压完之后进入解压过的tar包里 编译 make 安装和安装的位置 make PREFIX/opt/redis/redisserver install 成功后进入安装的位置 cd /opt/redis/redisserver/ 进入bin cd bin 找到redis-server,运行 ./redis-…

66城代表齐聚!蓝卓分享“全国经验”,批量复制推动中小企业数字化转型

9月6日下午,2024中小企业数字化转型现场交流活动在浙江宁波隆重举行。 全国66个中小企业试点城市500多名中小企业主管部门及专家学者,制造业企业、数字化转型服务商等重点企业代表齐聚宁波,共同探讨中小企业数字化转型的模式和路径。 工业和…

Keysight E4991A射频阻抗/材料分析仪3GHz

Keysight E4991A射频阻抗/材料分析仪3GHz KEYSIGHT E4991A(安捷伦)(要求提供) Keysight E4991A 射频阻抗/材料分析仪提供出色的阻抗测量性能和强大的内置分析功能。它将为评估 3 GHz 范围内组件的组件和电路设计师提供研发创新。…

小琳AI课堂:深入学习Transformer模型

大家好,这里是小琳AI课堂。今天我们来深入学习Transformer模型,这个在深度学习领域引发革命的技术。 Transformer模型的革命性优势 Transformer模型被认为是引发了深度学习领域革命的技术,主要原因有以下几点: 突破性的性能提升…

智能化升级:未来交流充电桩的创新之路

随着电动汽车的普及,交流充电桩作为充电基础设施的重要组成部分,其未来的发展趋势备受关注。本文将探讨交流充电桩在未来可能呈现的几个发展方向。 一、智能化升级 未来的交流充电桩将更加智能化。通过物联网技术,充电桩将能够实现远程监控…