Mysql内核查询成本计算

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Mysql内核查询成本计算

sql语句查询成本的组成

  I/O成本:将数据从磁盘读到内存的成本。

  CPU成本 数据读到内存后过滤、排序得到满足条件数据的成本。

  总成本  =I/O成本+CPU成本

注意:对于InnoDB存储引擎来说,页是磁盘和内存之间交互的基本单位,MySQL规定读取一个页 面花费的成本默认是1.0,读取以及检测一条记录是否符合搜索条件的成本默认是0.2。 1.0、0.2这些数字称之为成本常数,这两个成本常数我们最常用到,当然还有其他的成本常数。

查看mysql执行所有可能途径使用的成本

  1. 开启trace工具来一查究竟,开启trace工具会影响mysql性能,所以只能临时分析sql使用,用完之后立即关闭,具体方法参考:Mysql索引优化实战一_季风泯灭的季节的博客-CSDN博客

2. 使用explain查看,在explain后面加上 format=json 即可。

explain format=json SELECT  * from test5

单表查询的成本

 计算成本的过程

1、根据搜索条件,找出所有可能使用的索引

2、计算全表扫描的代价

3、计算使用不同索引执行查询的代价

4、对比各种执行方案的代价,找出成本最低的那一个

 全表扫描的代价

    I/O成本=总页数*1.0+1.1

    CPU成本 =总记录数*0.2+1.0

   数据库表都维护了总记录数, InnoDB是一个估算的值,MYISAM是一个准确的值。通过SHOW TABLE STATUS 命令可以查到。总页数则用表的总大小➗16➗1024得到。

 二级索引的代价

    1. 使用二级索引的成本

         如果是范围查询则算一次IO,因为它属于顺序IO。如果是精准查询则有几个就是几次IO,因为它是随机IO.顺序IO的效率大概是随机IO的40-400倍。如 in(1,3)就是两次IO。二级索引的成本如下:

      I/O成本=待查找总页数(IO次数)*1.0

      CPU成本 =待回表总记录数*0.2+0.01

    2. 回表的代价

        mysql需先计算出要回表的记录数,如果总记录数小于10页,则精准计算,如果大于10页,则以前10页的平均记录数X页数(页数从父节点的关键字数统计得出)进行估算。

      I/O成本=待回表总记录数*1.0

      CPU成本 =总记录数*0.2

  使用二级索引时不用考虑回表的CPU成本。总成本等于上述三者之和。

通过上述比较我们可以联想到,当走索引需要回表的记录数接近或大于原表的总页数时,走索引回表造成的成本可能就比不走索引的成本要高,那么mysql优化器可能会选择全表扫描。

表关联查询的成本

MySQL中连接查询采用的是嵌套循环连接算法,驱动表会被访问一次,被 驱动表可能会被访问多次,所以对于两表连接查询来说,它的查询成本由下边两个部分 构成:

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

2. 多次查询被驱动表的成本(具体查询多少次取决于对驱动表查询的结果集中有多少条

记录)

对驱动表进行查询后得到的记录条数称之为驱动表的 扇出 (英文名:fanout)。很显然 驱动表的扇出值越小,对被驱动表的查询次数也就越少,连接查询的总成本也就越低。 当查询优化器想计算整个连接查询所使用的成本时,就需要计算出驱动表的扇出值。

如果使用的是全表扫描的方式执行的单表查询,那么计算驱动表扇出时需要猜满足搜索条件的记录到底有多少条(不借助索引)。

如果使用的是索引执行的单表扫描,那么计算驱动表扇出的时候需要猜满足除使用到 对应索引的搜索条件外的其他搜索条件的记录有多少条(借助索引先过滤)。

MySQL把这个猜的过程称之为 condition filtering 。当然,这个过程可能会使用到索 引,也可能使用到统计数据,也可能就是MySQL单纯的瞎猜。

两表连接的成本分析

连接查询的成本计算公式是这样的:

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

可以知道,要想优化表关联查询有两个方向:

  1.  尽量减少驱动表的扇出,即以小表做驱动表。

  2. 减少被驱动表的单次访问成本(因为扇出数存在,使得单次访问被驱动表),即尽可能的避免磁盘IO,去走索引,且让回表的记录数尽可能的少。

多表连接的成本

   多表连接的成本与两表连接类似,只是后一个表以前面的sql查询结果为扇出去查询,其查询性能消耗为 x+ny+nz....,x、y、z为各表查询成本,n为扇出数。同时,mysql在sql分析阶段付出的成本是n!。因此,它的表越多性能越差。

where 和on 的区别

1. 执行时间不同,on先执行从各个表中过滤数据后进行关联,再使用where对结果进行进一步过滤。

2. on只对被驱动表有效。

3.

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
9天前
|
SQL 前端开发 关系型数据库
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
39 9
|
11天前
|
缓存 监控 关系型数据库
如何优化MySQL查询速度?
如何优化MySQL查询速度?【10月更文挑战第31天】
36 3
|
16天前
|
SQL NoSQL 关系型数据库
2024Mysql And Redis基础与进阶操作系列(5)作者——LJS[含MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页等详解步骤及常见报错问题所对应的解决方法]
MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页、INSERT INTO SELECT / FROM查询结合精例等详解步骤及常见报错问题所对应的解决方法
|
15天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
77 1
|
16天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第26天】数据库作为现代应用系统的核心组件,其性能优化至关重要。本文主要探讨MySQL的索引策略与查询性能调优。通过合理创建索引(如B-Tree、复合索引)和优化查询语句(如使用EXPLAIN、优化分页查询),可以显著提升数据库的响应速度和稳定性。实践中还需定期审查慢查询日志,持续优化性能。
47 0
|
8天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
22 4
|
6天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
19 1
|
1月前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
61 3
Mysql(4)—数据库索引
|
17天前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
59 2
|
20天前
|
存储 关系型数据库 MySQL
MySQL vs. PostgreSQL:选择适合你的开源数据库
在众多开源数据库中,MySQL和PostgreSQL无疑是最受欢迎的两个。它们都有着强大的功能、广泛的社区支持和丰富的生态系统。然而,它们在设计理念、性能特点、功能特性等方面存在着显著的差异。本文将从这三个方面对MySQL和PostgreSQL进行比较,以帮助您选择更适合您需求的开源数据库。
80 4