美文网首页
数据库内幕:查询优化技术

数据库内幕:查询优化技术

作者: 谭英智 | 来源:发表于2021-08-16 21:01 被阅读0次

对于一条SQL,数据库会对其进行优化,找到最小代价的执行路径来运行。

整条优化的中心思想只需要把握以下一点:

  • 尽可能早的把数据过滤到一个更低的数量级

主要的优化手段

查询重用技术

  • 查询结果重用
  • 查询计划重用

查询重写规则

对sql进行等价转换

  • 语法级
  • 代数级
  • 语义级
  • 物理级

主要用到的技术思路:

  • 视图重写
  • 把嵌套子查询、外连接、嵌套连接转变为多表连接
  • 谓词转换
  • 简化where、having、on条件

常见的手段:

  • 选择操作:通过把选择下推(先执行),得到一个更小的数据集,再进行其他操作

  • 投影操作:通过把投影下推,得到一个更小列数的数据集,再进行其他操作

  • 连接操作:再多表连接的时候,以何种方式连接会更优,ABC还是BCA

  • 索引优化

  • 代价估算

  • 子查询优化

    默认:父查询种的每一行,都执行一次子查询

    • 独立执行子查询,对于没有依赖父查询的子查询
    • 子查询条件外提,在父查询中进行条件下推
    • 子查询合并:对于类似的子查询可以合并成一个子查询
    • 子查询展开,变成与父查询并联,把查询转为多表连接
    • 聚集函数上推,并子查询展开

    对in关键字的优化:

    通过Exists 加子查询的方式

    优化的原理是子查询转变为连接条件关联父查询,为Hash半连接。如果对in不做优化,则父查询的结果有多少条,就会执行多少次子查询

    优化后,子查询子需要查询一次,并通过hash与父查询进行关联,加快了查询的速度

  • 视图重写:视图有可能是多表关联的,但有些条件会和投影只对某一个表感兴趣,此时可以对视图进行重写,把多表查询简化成单表查询

  • 谓词重写:

    通过重写,可以更好的使用索引

    • name like 'Abc%' =? name >= 'Abc' && name <'Abd'
    • no between 10 and 20 => no >=10 && no <= 20
    • age in ( 8 10) => age =8 or age = 10
    • or 重写: (sex = 'f' and sno > 15) or age>18 => sex='f' and sno>15 union age>18
    • 条件简化:常量替换
  • 外连接消除

  • 嵌套表消除:转变为多表关联,减少子表扫描次数

查询算法优化技术

  • 单表结点

    考虑一次查询的IO尽可能低,来选择走索引还是直接走遍历

  • 两表结点

    考虑表连接的代价,判断通过哪种方式的连接会更少占内存,会更快的得到最终结果。

    连接时是使用hash连接还是归并连接还是嵌套连接

  • 多表中间结点

    AB先连接还是BC先连接

优化的手段:

  • 基于规则优化

    通过经验,归类出一些常规的手段,进行优化

  • 基于代价优化

    对数据进行动态分析,评估出一个较优或者最优的路径,进行查询

多表连接的优化算法有:

  • SYSTEM-R:穷举所有,得到最优解
  • 启发式搜索算法:基于规则,得到评估函数,进行启发式搜索
  • 贪心算法:以当前情况判断哪条路径最优
  • 动态规划
  • 遗传算法:通过随机模拟进化,得到较优解

并行查询优化技术

通过对SQL的计划进行并行拆分,在多资源情况下,进行并行运行各个部分,更快的得到终解

分布式查询优化技术

在多台物理机上跑SQL,代价=IO代价+CPU代价+通讯代价

优化又分为逻辑优化和物理优化

  • 逻辑优化:通过对SQL进行关系代数变换得到一个更有的解
  • 物理优化:通过对数据的读取分析、表的连接方式对查询进行优化

物理优化

它解决的问题:

  • 单表查询中,挑选怎样的扫描最优
  • 两表连接时,如果连接最优
  • 多表连接时,哪种连接顺序最优

代价函数

总代价 = IO 代价 + CPU 代价

相关文章

  • 数据库内幕:查询优化技术

    对于一条SQL,数据库会对其进行优化,找到最小代价的执行路径来运行。 整条优化的中心思想只需要把握以下一点: 尽可...

  • PostgreSQL统计信息和代价估算

    内容来源:《PostgreSQL技术内幕:查询优化深度探索》,电子工业出版社,作者:张树杰。 优化器进行物理优化需...

  • MySQL书目

    MySQL数据库索引设计与优化 MySQL技术内幕 MySQL排错指南 高性能MySQL MySQL DBA修炼之道

  • 学习的技术栈,技术书籍必看for me

    《高性能MySQL》 《数据库索引设计与优化》 《MySQL技术内幕:InnoDB存储引擎》 《数据结构与算法分析...

  • 数据库技术

    数据库技术 sschrodinger 2019/05/06 引用 MySQL 技术内幕 - InnoDB 存储引擎...

  • 数据库存储原理特性索引优化

    说一下mysql数据库存储的原理? 事务的特性? 数据库索引 数据库怎么优化查询效率? 数据库优化方案 优化索引、...

  • mysql调优

    一 、查询优化、索引优化、库表结构优化 1. 查询性能优化 1.1) 优化数据访问:1、是否向数据库请求了不需要的...

  • SQL优化器原理 - 查询优化器综述

    本文主要是对数据库查询优化器的一个综述,包括: 查询优化器定义、分类 查询优化器执行过程 CBO框架Calcite...

  • MySQL查询优化(分析、索引、配置等)

    数据库的优化包括两个方面,一是SQL语句的优化,二是数据库服务器和配置的优化。下面先讲查询语句的优化。 查询语句优...

  • 数据库索引创建与优化

    对于数据库的优化主要包括三个部分:查询优化、索引优化和字段类型优化,其中,索引优化则是数据库优化的重中之重。一个查...

网友评论

      本文标题:数据库内幕:查询优化技术

      本文链接:https://www.haomeiwen.com/subject/keyvbltx.html