我的编程空间,编程开发者的网络收藏夹
学习永远不晚

深入了解MySQL中索引优化器的工作原理

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

深入了解MySQL中索引优化器的工作原理

本文导读

本文将解读MySQL数据库查询优化器(CBO)的工作原理。简单介绍了MySQL Server的组成,MySQL优化器选择索引额原理以及SQL成本分析,最后通过 select 查询总结整个查询过程。

一、MySQL 优化器是如何选择索引的

下面我们来看这张表,SUB_ODR_ID字段创建了相关的 2 个索引,根据我们前面所学我们建立一个PRIMARY KEY (ID)自增主键索引,(LOG_ID, SUB_ODR_ID)设置为联合索引、唯一索引,两个时间CREATE_TIME、UPDATE_TIME分别设置两个索引。

CREATE TABLE `***`  (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `LOG_ID` varchar(32) NOT NULL COMMENT '交易流水号',
  `ODR_ID` varchar(32) NOT NULL COMMENT '父单号',
  `SUB_ODR_ID` varchar(32) NOT NULL COMMENT '子单号',
  `CREATE_TIME` datetime(0) NOT NULL COMMENT '创建时间',
  `CREATE_BY` varchar(32) NOT NULL COMMENT ' 创建人',
  `UPDATE_TIME` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
  `UPDATE_BY` varchar(32) NOT NULL COMMENT '更新人',
  PRIMARY KEY (`ID`) USING BTREE,
  UNIQUE INDEX `UNQ_LOG_SUBODR_ID`(`LOG_ID`, `SUB_ODR_ID`) USING BTREE,
  INDEX `IDX_ODR_ID`(`ODR_ID`) USING BTREE,
  INDEX `IDX_SUB_ID`(`SUB_ODR_ID`) USING BTREE,
  INDEX `IDX_CREATE_TIME`(`CREATE_TIME`) USING BTREE,
  INDEX `IDX_UPDATE_TIME`(`UPDATE_TIME`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 SET = utf8 COLLATE = utf8_general_ci COMMENT = '分摊业务明细表' ROW_FORMAT = Dynamic;

在查询字段 SUB_ODR_ID 中,理论上可以使用三个相关的索引:UNQ_LOG_SUBODR_ID、IDX_SUB_ID,MySQL优化器如何从这三个索引中进行选择?

在关系数据库中,B+树只是用于存储的数据结构。

如何使用它取决于数据库的优化器。优化器确定特定索引的选择,即执行计划。优化器的选择基于成本,成本越低,首选指数越高。

1、MySQL数据库组成

MySQL数据库由Server(服务器)层和Engine(引擎)层组成。

Serve层有SQL分析器、SQL优化器和SQL执行器,负责SQL语句的具体执行过程。

Engine层负责存储特定数据,例如最常用的InnoDB存储引擎,以及用于在内存中存储临时结果集的TempTable引擎。

SQL优化器将分析所有可能的执行计划,并选择成本最低的执行。这个优化器被称为CBO(基于成本的优化器)。

深入了解MySQL中索引优化器的工作原理

2、MySQL数据库成本计算

在 MySQL中,一条 SQL 的计算成本计算,很好理解,就是访问数据库(数据库页、磁盘)+处理数据。

CPU成本,表示计算成本,例如索引键值的比较、记录值的比较和结果集的排序。这些操作都在服务器层完成

IO成本,表示引擎级IO的成本,MySQL 8.0可以通过区分表的数据是否在内存中来分别计算读取内存IO和磁盘IO的成本。

Cost  = Server Cost + Engine Cost  = CPU Cost + IO Cost

MySQL优化器认为,如果一段SQL需要创建一个基于磁盘的临时表,那么此时的成本是最大的,是基于内存的临时表的20倍。比较索引键值和记录的成本很低,但如果要比较的记录很多,成本就会非常大。

MySQL 优化器认为,从磁盘读取的开销是内存开销的 4 倍(成本不是一成不变的会根据硬件变化)。

二、MySQL查询成本

查看各成本的值,MySQL优化器的工作原理,我们执行下面这行SQL语句,分析执行过程,MySQL 索引选择是基于 SQL 执行成本

EXPLAIN FORMAT=json 
select * from test.fork_business_detail f where f.sub_odr_id = ''

read_cost表示从InnoDB存储引擎读取的成本;

eval_cost表示服务器层的CPU成本;

prefix_cost表示SQL的总成本;

data_read_per_join 表示读取记录中的字节总数。

{
	"query_block": {
		"cost_info": {
			"query_cost": "1.20"
		},
		"table": {
			"Access_type": "ref",
			"possible_keys": [
				"IDX_SUB_ID"
			],
			"key": "IDX_SUB_ID",
			"used_key_parts": [
				"SUB_ODR_ID"
			],
			"key_length": "98",
			"ref": [
				"const"
			],
			"cost_info": {
				"read_cost": "1.00",
				"eval_cost": "0.20",
				"prefix_cost": "1.20",
				"data_read_per_join": "1K"
			},
			"used_columns": [
				"ID",
				"LOG_ID",
				"ODR_ID",
				"SUB_ODR_ID",
				"CREATE_TIME",
				"CREATE_BY",
				"UPDATE_TIME",
				"UPDATE_BY"
			]
		}
	}
}

三、SELECT 执行过程

如何提高MySQL的查询性能?首先,您需要了解查询优化器进行SQL处理的整个过程。SELECT SQL 的执行过程为例,如下图所示: 

深入了解MySQL中索引优化器的工作原理

客户端向服务器发送SELECT查询;服务器首先检查查询缓存。如果缓存被命中,存储在缓存中的结果将立即返回。否则,进入下一阶段;

服务器执行SQL解析、预处理,查询优化器生成相应的执行计划;MySQL根据优化器生成的执行计划调用存储引擎的API执行查询;结果将返回到客户端,并同时放入查询缓存。

总结

本文解读了MySQL数据库查询优化器(CBO)的工作原理。简单介绍了MySQL Server的组成,MySQL优化器选择索引额原理以及SQL成本分析,最后通过 select 查询总结整个查询过程。

到此这篇关于深入了解MySQL中索引优化器的工作原理的文章就介绍到这了,更多相关MySQL索引优化器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

深入了解MySQL中索引优化器的工作原理

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

深入解析MySQL索引的原理与优化策略

目录索引的概念索引的原理索引的类型索引的使用索引的使用方式注意事项索引优化技巧索引的概念mysql索引是一种用于加速数据库查询的数据结构,它类似于书籍的目录,能够快速指导我们找到需要的信息。MySQL索引可以根据一定的算法和数据结构进行排
2023-03-31

MySQL索引优化器工作原理是什么

这篇“MySQL索引优化器工作原理是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MySQL索引优化器工作原理是什么”文
2022-11-30

MySQL中的查询优化器工作原理解析

MySQL是一种常用的关系型数据库管理系统,广泛应用于各种Web应用程序和大型企业级系统中。在MySQL的日常使用中,查询语句是最常见和重要的操作之一。为了提高查询效率和性能,MySQL引入了查询优化器。查询优化器是MySQL内部的一个组件
2023-10-22

MySQL查询优化器工作原理详解

MySQL查询优化器是数据库管理系统(DBMS)中的一个关键组件,它负责决定如何最有效地执行SQL查询。查询优化器的工作原理涉及多个步骤和组件,以下是对其工作原理的详细解释:查询解析:当用户提交一个SQL查询时,查询优化器首先会对其进行解析
MySQL查询优化器工作原理详解
2024-10-20

深入解析MongoDB的查询优化与索引设计原则

MongoDB是一种流行的NoSQL数据库,它被广泛应用于许多大规模的Web应用程序和数据驱动的应用程序。在使用MongoDB时,查询优化和索引设计是非常重要的,可以显著提高数据库的性能和响应速度。本文将深入解析MongoDB的查询优化和索
深入解析MongoDB的查询优化与索引设计原则
2023-11-02

深入解析Golang中锁的工作原理

Golang中锁的工作原理深度剖析引言:在并发编程中,避免竞态条件(race condition)是至关重要的。为了实现线程安全,Golang提供了丰富的锁机制。本文将深入剖析Golang中锁的工作原理,并提供具体的代码示例。一、互斥锁(M
深入解析Golang中锁的工作原理
2023-12-28

深入解析Golang切片的工作原理与性能优化技巧

Golang切片原理解读:切片的操作方法与性能优化技巧简介:Golang是一门高性能编程语言,它的切片(slice)是一个非常重要且常用的数据结构。切片不仅能够高效地操作数据,还能节省内存空间。本文将深入解读Golang切片的原理,介绍切
深入解析Golang切片的工作原理与性能优化技巧
2024-01-24

深入理解Elasticsearch的分布式索引机制(Elasticsearch分布式索引如何工作?)

Elasticsearch的分布式索引机制是一种高可用、可扩展且容错的数据管理方式。它使用分片将索引细分,并创建副本以提高数据可用性。主分片处理写入,副本分片处理读取。分片分配策略用于确定分片存储位置。路由机制确保文档始终路由到相同的分片,优化查询性能。合并有助于维护分片大小,提高性能并减少存储开销。通过分布式索引机制,Elasticsearch实现了高可用性、可伸缩性、故障容错性、并行处理和优化查询性能。
深入理解Elasticsearch的分布式索引机制(Elasticsearch分布式索引如何工作?)
2024-04-02

索引在Oracle中处理大量插入操作的优化

在Oracle中处理大量插入操作时,可以通过以下方式来优化索引的性能:考虑使用批量插入操作:如果要插入大量数据,可以考虑使用批量插入操作来减少插入操作的次数,从而提高性能。可以使用INSERT INTO table_name SELECT
索引在Oracle中处理大量插入操作的优化
2024-08-15

深入了解Java线程池的原理使用及性能优化

JAVA线程池是一种管理和复用线程资源的机制,可以提高程序的效率和响应速度。本文将介绍线程池的原理、使用方法和性能优化技巧,帮助读者深入了解和应用JAVA线程池
2023-05-17

Golang中接口的工作原理和特性深入解析

探索Golang中接口的实现原理与特性引言:Golang是一种现代化的编程语言,凭借其简洁性、高效性和强大的并发支持而受到广泛关注。其中,接口是Golang中一个重要的特性,使得代码能够更加灵活、可扩展和易于维护。本文旨在深入探索Gola
Golang中接口的工作原理和特性深入解析
2024-01-24

编程热搜

目录