MySQL 优化器原来是这样工作的
文章目录
- 优化器概述
- 逻辑转换
- 基于成本的优化
- 控制优化程度
- 设置成本常量
- 数据字典与统计信息
- 控制优化行为
- 优化器和索引提示
- 总结
大家好,我是只谈技术不剪发的 Tony 老师。我们在 MySQL 体系结构中介绍了 MySQL 的服务器逻辑结构,其中查询优化器(optimizer)负责生成 SQL 语句的执行计划,是决定查询性能的一个关键组件。本文将会深入分析 MySQL 优化器工作的原理以及如何控制优化器来实现 SQL 语句的优化。
优化器概述
MySQL 优化器使用基于成本的优化方式(Cost-based Optimization),以 SQL 语句作为输入,利用内置的成本模型和数据字典信息以及存储引擎的统计信息决定使用哪些步骤实现查询语句,也就是查询计划。
查询优化和地图导航的概念非常相似,我们通常只需要输入想要的结果(目的地),优化器负责找到最有效的实现方式(最佳路线)。需要注意的是,导航并不一定总是返回最快的路线,因为系统获得的交通数据并不可能是绝对准确的;与此类似,优化器也是基于特定模型、各种配置和统计信息进行选择,因此也不可能总是获得最佳执行方式。
从高层次来说,MySQL Server 可以分为两部分:服务器层以及存储引擎层。其中,优化器工作在服务器层,位于存储引擎 API 之上。优化器的工作过程从语义上可以分为四个阶段:
- 逻辑转换,包括否定消除、等值传递和常量传递、常量表达式求值、外连接转换为内连接、子查询转换、视图合并等;
- 优化准备,例如索引 ref 和 range 访问方法分析、查询条件扇出值(fan out,过滤后的记录数)分析、常量表检测;
- 基于成本优化,包括访问方法和连接顺序的选择等;
- 执行计划改进,例如表条件下推、访问方法调整、排序避免以及索引条件下推。
逻辑转换
MySQL 优化器首先可能会以不影响结果的方式对查询进行转换,转换的目标是尝试消除某些操作从而更快地执行查询。例如(数据来源):
mysql> explain-> select *-> from employee-> where salary > 10000 and 1=1;
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------------+
| 1 | SIMPLE | employee | NULL | ALL | NULL | NULL | NULL | NULL | 25 | 33.33 | Using where |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)mysql> show warnings\G
*************************** 1. row ***************************Level: NoteCode: 1003
Message: /* select#1 */ select `hrdb`.`employee`.`emp_id` AS `emp_id`,`hrdb`.`employee`.`emp_name` AS `emp_name`,`hrdb`.`employee`.`sex` AS `sex`,`hrdb`.`employee`.`dept_id` AS `dept_id`,`hrdb`.`employee`.`manager` AS `manager`,`hrdb`.`employee`.`hire_date` AS `hire_date`,`hrdb`.`employee`.`job_id` AS `job_id`,`hrdb`.`employee`.`salary` AS `salary`,`hrdb`.`employee`.`bonus` AS `bonus`,`hrdb`.`employee`.`email` AS `email` from `hrdb`.`employee` where (`hrdb`.`employee`.`salary` > 10000.00)
1 row in set (0.00 sec)
显然,查询条件中的 1=1 是完全多余的。没有必要为每一行数据都执行一次计算;删除这个条件也不会影响最终的结果。执行EXPLAIN
语句之后,通过SHOW WARNINGS
命令可以查看逻辑转换之后的 SQL 语句,从上面的结果可以看出 1=1 已经不存在了。
MySQL 优化器原来是这样工作的相关推荐
- mysql not in优化_98%的人不知道的MySQL优化器原理
| 作者 梁东阳,数据库研发中心数据库内核工程师,负责腾讯云MySQL的内核开发. 在日常运维中,相信不少人都收藏了很多关于查询优化的方法论和小技巧,但是仔细想想,你真的了解这些优化背后的原理吗? ...
- MySQL优化器选错索引情况
MySQL优化器选错索引情况 1. 优化器选错索引 2. 优化器的逻辑 3. 索引选择异常和处理 1. 优化器选错索引 之前MySQL架构以及执行sql查询语句介绍过MySQL优化器可以帮助我们优化s ...
- MySQL优化器_MySQL查询优化器
MySQL优化器 MySQL架构图 讲到MySQL,就绕不开他的架构图.MySQL是一个经典的C/S架构.服务器这边分两层:第一层是Server层,第二层是存储引擎.Server层处理主要的业务操作流 ...
- MySQL优化器:index merge介绍
在MySQL官方手册上,关于index merge的介绍非常非常少.甚至还有不少误导的地方,这次把5.1版本关于此类优化处理的代码细看了一遍,以案例的方式介绍了各种实用index merge访问类型的 ...
- Mysql 优化器内部JOIN算法hash join On-Disk Hash Join Grace Hash Join Hybrid hash join过程详解
Mysql 各种hash join算法讲解 hash join的概述 提到hash join之前自然得说Nest loop join,以两个表的关联为例,它其实是个双层循环,先遍历外层的表(n条),再 ...
- MySQL优化器如何预估查询成本
MySQL有哪些查询成本 MySQL 执行一个查询可以有不同的执行方案.在我们开发过程中,所有写过的sql语句都会丢给MySQL端的优化器.由优化器判断并选择其中成本最低,或者说代价最低的那种方案去真 ...
- mysql优化器怎么选择索引,为什么MySQL查询优化器会选择聚集主索引上的二级索引?...
为什么Mysql优化器在执行'select * from lookup'而没有order by子句时选择二级索引. 它只是一个侥幸,或者这是一个幕后优化,假设你添加了一个二级索引,它比主键更重要. 我 ...
- mysql优化器放弃索引场景,MYSQL索引优化(索引失效场景)
学习mysql是作为一名Java工程师必不可少的事情,但是我们只认识mysql的增删查改建表等等的sql语句其实远远不够的,对于进阶mysql来说,索引是一个很重要的部分.下面我们就来说一下在mysq ...
- mysql 优化器代码_Mysql查询优化器
Mysql查询优化器 本文的目的主要是通过告诉大家,查询优化器为我们做了那些工作,我们怎么做,才能使查询优化器对我们的sql进行优化,以及启示我们sql语句怎么写,才能更有效率.那么到底mysql到底 ...
最新文章
- java面向对象-------静态初始化块
- 百度CTO王海峰获“光华工程科技奖”,深耕自然语言处理近30年
- OSChina 技术周刊第二十九期 —— HTTP 有时候比 HTTPS 好?
- 在Win7中安装Oracle 10g时检测报错的解决办法
- php钩子是啥意思,php中的钩子理解及应用实例分析
- 解决Error spawning 'cmd.exe'的问题
- 【Android】动态UI : LayoutParams.addRule(...) LayoutParams.addRule(..., ...)
- mybatis plus 批量保存_mybatis源码分析
- python饼形图_Python | 饼形图
- [swift] LeetCode 448. Find All Numbers Disappeared in an Array
- python界面颜色设置_pycharm修改界面主题颜色的方法
- 从Word2Vec到Bert,聊聊词向量的前世今生(一)
- Python进阶(十三) os、random、time等标准库
- 数据结构基础(3)---C语言实现单链表
- 线性代数及其应用笔记
- 关于AP没办法获取IP地址故障排查及思路。
- kuwo.php源码,酷我音乐官方flash播放器调用代码
- html5在线画板菱形怎么画,HTML5 Canvas 制作一个“在线画板”
- 我是如何将LINE表情包转化为微信表情包的?/How I convert Line stickers into Wechat stickers just as the way they are?
- 论文详解-MolGPT: Molecular Generation Using a Transformer-Decoder Model
热门文章
- 风控策略和模型的区别_风控策略
- 核心乐理---和弦基础
- java基础-数组-案例练习-检测一个字符串是否为回文 回文字符串是指正着读和反着读该字符串都是相同拼写
- 用Delphi制作BPL包
- 地表最强AI 辅助编程工具——GitHub Copilot安装教程
- mysql Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) fo...
- MyBatis动态批量插入、更新Mysql数据库的通用实现方案
- 零数科技创始人林乐博士荣登“长三角G60科创走廊创业榜单—星耀G60”
- pr里面怎么加css样式,放入pr剪辑中画面不全怎么办?
- 安全基础--23--应急响应(上)