当前位置: 首页 > article >正文

MySQL解析器和优化器,你了解它们吗?

解析器都做哪些事情

  • 其主要功能是将输入的SQL语句分解为语法单元,然后将这些语法单元转换为内部表示的数据结构,最终生成一个可执行的查询计划。解析器是MySQL中的一个重要组成部分,它直接影响查询的性能和正确性。

词法分析

  • 将SQL语句分解为语法单元(token),如SELECT、FROM、WHERE等关键字、表名、列名、运算符等。词法分析器会识别和记录每个语法单元的类型和位置。

语法分析

  • 将词法分析器生成的语法单元按照SQL语法规则组合成语法树。语法分析器会检查SQL语句是否符合语法规则,同时生成抽象语法树,确定查询的逻辑结构。

语义分析

  • 在语义分析阶段,MySQL的SQL解析器会对SQL语句的语义进行检查。这一阶段的任务包括对表和列名进行解析,检查SQL语句的语义正确性,并将SQL语句转换为适当的内部数据结构。

优化器是怎么优化的

优化器分为两种方式,逻辑查询优化和物理查询优化

逻辑查询优化

  • 关系代数对SQL语句做一些等价变换,对条件表达式进行等价谓词重写、条件简化,对视图进行重写,对子查询进行优化,对连接语义进行了外连接消除、嵌套连接消除等。

物理查询优化:物理查询优化一般分为两种:

  • 基于规则的优化(RBO,Rule-Based Optimizer)

    • 这种方式主要是基于一些预置的规则对查询进行优化。

  • 基于代价的优化(CBO,Cost-Based Optimizer)

    • 这种方式会根据模型计算出各个可能的执行计划的代价,然后选择代价最少的那个。它会利用数据库里面的统计信息来做判断,因此是动态的。

举例:

DISTINCT优化

  • SELECT DISTINCT c1, c2, c3 FROM t1 WHERE c1 > const;

  • 优化成

  • SELECT c1, c2, c3 FROM t1 WHERE c1 > const GROUP BY c1, c2, c3;

JOIN优化(join需要从一个表多次在其他表中匹配,数据重复度高的话会进行优化)

  • SELECT class.class_num, class.class_name FROM class INNER JOIN roster WHERE class.class_num = roster.class_num;

  • 优化成

  • SELECT class_num, class_name FROM class WHERE class_num IN (SELECT class_num FROM roster);

合并优化

  • SELECT * FROM (SELECT * FROM t1) AS derived_t1;

  • 优化成
    SELECT * FROM t1; 


http://www.kler.cn/a/16069.html

相关文章:

  • ETH挖矿显卡超频信息汇总
  • 鸿蒙北向开发 : hdmfs-分布式文件系统
  • [pyspark] pyspark中如何修改列名字
  • 【Linux】HTTP协议和HTTPS加密
  • 基于Spring Boot与Redis的令牌主动失效机制实现
  • K8S单节点部署及集群部署
  • KDZD地埋线短路漏电试扎器
  • C++之深入解析如何实现一个线程池
  • 交叉编译相关知识整理
  • 安装Ubuntu22.04虚拟机的一些常见问题解决方法
  • 客户管理系统的作用有哪些?
  • Go分布式爬虫(二十四)
  • 这就是二分查找?(C语言版)
  • 【python】用ChatGPT使用爬虫
  • Python调用最小二乘法
  • PyQt6: 多网卡适配器的选择与显示(GPT4帮写)
  • 数据血缘落地方案
  • 【C++进阶知识】C++虚函数和虚函数表
  • verilog手撕代码3——序列检测和序列发生器
  • notepad++安装HexEditor插件查看二进制文件
  • 【C++】程序员必备知识:认识类与对象
  • nginx的proxy_pass路径转发规则浅析
  • 共创共建共享,2023北京老博会陪伴企业成长宣传计划开启
  • 使用chatGPT开发获取格点天气数据
  • YOLOv5代码解析——模型结构篇
  • 软件设计证书倒计时28天