数据库查询优化技术 学习笔记(一)

我是看李海翔的《数据库技术丛书·数据库查询优化器的艺术:原理解析与SQL性能优化》这本书的视频讲解学习的,因为数据库的知识学的不多,直接看优化有些吃力,慢慢补吧。现在要用一些优化的知识只能先看着了。

本文大概内容:

1.1 What is the Database Management System ?

1.2 What is the Relation Database Management System?

1.3 Why do we need to learn MySQL/PostgreSQL ?

2 What is the relational algebra ?

3 What is the technology Of Query Optimization ?

4 How to learn and master it ?

5.1Query Reuse

5.2Query Rewrite

5.3Query Optimization Algorithm

5.4Parallel query optimization

5.5Distributrd Query Optimization

(。。英文是为了强行记忆这些单词。。)

1.1 What is the Database Management System ?

数据库管理系统(Database Management System):

1是一种操纵和管理数据的大型软件,用于建立、使用和维护数据,简称DBMS。
2它对数据进行统一的管理和控制,以保证数据的安全性和完整性。
3用户通过DBMS访问数据库中的数据,数据库管理员也通过DBMS进行数据库的维护工作。
4它可使多个应用程序和用户用不同的方法在同时或不同时刻去建立,修改和询问数据。
5DBMS提供数据定义语言DDL(Data Definition Language)和数据库操作语言DML(Data Manipulation  Language),供用户定义数据库的模式结构与权限约束,实现对数据的追加、删除等操作。

只要做数据处理,软件规模达到一定程度,似乎都称为数据库。

衡量是否是数据库的标准:
ACID,是指在数据库管理系统(DBMS)中事务所具有的四个特性:
1)原子性(Atomicity)
2)一致性(Consistency)
3)隔离性(Isolation)
4)持久性(Durability)

1.2 What is the Relation Database Management System?历史上的几种类型的数据库

1层次性
2网状型
3关系型

关系数据库,是建立在关系数据库模型基础上的数据库,借助于关系代数等概念和方法来处理数据库中的数据,同时也是一个被组织成一组拥有正式描述性的表格,该形式的表格作用的实质是装载着数据项的特殊收集体,这些表格中的数据能以许多不同的方式被存取或重新召集而不需要重新组织数据库表格。

1.3 Why do we need to learn MySQL/PostgreSQL ?

趋势1:云计算,淘汰大部分的运维人员
趋势2:云数据库,淘汰大部分以商业数据库为职业的DBA
趋势3:电商等兴起,对开源数据库技术的人员需求增多
...

1.4 Why do we need to master Query Optimization Technology ?

数据库查询优化技术一直是DBMS实现技术中的精华,也是重点和难点。

...

2 What is the relational algebra ? 数据库中,关系代数是一阶逻辑的分支,是闭合于运算下的关系的集合。运算作用于一个或多个关系上来生成一个关系。关系代数是计算机科学的一部分。
在纯数学中的关系代数是有关于数理逻辑和集合论的代数结构。

SQL的查询语言松散的基于了关系代数,尽管SQL中的操作数(表)不完全是关系,很多有用的关系代数的理论在SQL对应者中不成立。


sql-01

关系代数是一种抽象的查询语言,用对关系的运算来表达查询,作为研究关系数据语言的数学工具。

关系代数的运算对象是关系,运算结果亦为关系。关系代数用到的运算符包括四类:
1)集合运算符
2)专门的关系运算符
3)算数比较符
4)逻辑运算符

比较运算符和逻辑运算符是用来辅助专门的关系运算符进行操作的,所以按照运算符不同,主要将关系代数分为传统的集合运算和专门的关系运算两类。

3 What is the technology Of Query Optimization ?

4 How to learn and master it ?

数据库调优/Database Tuning

数据库调优可以使数据库应用运行得更快,其目标是:
使数据库有更高的吞吐量,更短的响应时间,被调优的对象是整个数据库管理系统总体。

查询语句调优:被调优的对象是一条查询语句。

数据库调优的方式通常有如下几种方式
1)人工调优,主要依赖于人,效率低下;要求操作者完全理解常识所依赖的原理,还需要对应用、数据库管理系统、操作系统以及硬件有广泛而深刻的理解。最体现维护人员的价值。
2)基于案例的调优,总结典型应用案例情况中数据库参数的推荐配置、数据逻辑层设计等情况,从而为用户的调优工作提供一定的参考和借鉴。但这种方法忽略了系统的动态性和不同的系统间存在的差异。
3)自调优,为数据库系统建立一个模型,根据“影响数据库系统性能效率的因素”,数据库系统自动进行参数的配置。一些商业数据库,实现了部分自调优技术。

数据库调优五个阶段的主要技术

1应用情况的估算。
应用的使用方式(把业务逻辑转换为数据库的读写分布逻辑,以是读多写少还是读写均衡等来区分OLTP和OLAP;应用对数据库的并发情况、并发是否可以池化等)、数据量、对数据库的压力、峰值压力等做一个预估。
2系统选项策略
确定什么样的数据库可以适用应用需求,并确定数据库是使用开源的还是商业的,是集使用群还是单机系统,同时对操作系统、中间件、硬件、网络等进行选型。
3数据模型的设计
主要是根据业务逻辑,从几个角度考虑表的逻辑结构,如下:
3.1 E-R模型设计:遵循了E-R模型设计原理。偶尔的适当程度的非规范化可以改善系统查询性能。
3.2 数据逻辑分布策略:目的是减少数据请求的不必要的数据量,把用户需要的数据返回;可用的技术如分区、用E-R模型分表等(如互联网企业典型的用法,根据业务不同,进行分库,分表等操作)。
3.3数据物理存储策略:目的是减少IO,如启用压缩技术、把索引和表数据的存储分开,不同的表数据分布于不同的表空间,不同的表空间分布在不同的物理存储上(尤其是读写量大的表空间分布在不同的物理存储上)、日志、索引和数据分布在不同的物理存储上等。
3.4索引:在查询频繁的对象上建立合适的索引,使索引的正效应大于负效应(索引的维护存在消耗)。
4SQL设计
编写正确的、查询效率高的SQL语句。这依据的主要是“查询重写规则”,编写语句的过程中要注意,要有意识地保障SQL能利用到索引。
5数据库功能的启用
数据库为提高性能提供了一些功能,可合理使用,具体如下:
5.1查询重用:根据实际情况进项配置,可缓存查询执行计划、查询结果等。
5.2数据库参数的设置:可设置系统上模拟实际运行环境,加大压力进行系统测试,提前发现问题。
6系统监控与分析。在工业环境下,加强对系统的运行监控和日常的分析工作,具体如下:
6.1应用系统表现:收集用户对应用系统的使用意见、系统存在问题等,因为这些可能是用户在第一时间发现的。
6.2OS环境监控:实时监控CPU、内存、IO等,并对比实时情况与历史正常情况。
6.3据库内部装况监控:一些数据库提供系统表、视图、工具等手段,向用户提供数据库运行过程中内部状况的信息,如锁的情况,这些都需要实时监控,并对比实时情况与历史正常情况。
6.4日志分析:在数据库的日志、操作系统的日志中找出异常事件,定位问题。

(二)

1.1 Query Reuse
查询重用是指尽可能利用先前的执行结果,以达到节约查询计算全过程的时间并减少资源消耗的目的。

目前查询重用技术主要集中在两个方面:
1查询结果的重用。在缓存区中分配一块缓冲块,存放该SQL语句文本和最后的结果集,当同样的SQL输入时,直接把结果返回。查询结果的重用技术节约了查询计划生成时间,减少了查询执行全过程的资源消耗。
2查询计划的重用。缓存一条查询语句的执行计划及其相应语法树结构。查询计划的重用技术减少了查询计划生成的时间和资源消耗。

查询重用技术利弊:
1弊端:结果集很大会消耗很大的内存资源,同样的SQL不同用户应该获取的结果集可能不同
2利端:节约了CPU和IO消耗。在实际使用的过程中,趋利避害,根据实际情况选用

1.2 Query Rewrite查询重写:
是查询语句的一种等价转换,即对于任何相关模式的任意状态都会产生相同的结果。

查询重写的两个目标:
1将查转换为等价的效率更高的形式,例如将效率低的谓词转换为效率高的谓词、消除重复条件等。
2尽量将查询重写为等价、简单且不受表顺序限制的形式,为物理查询优化阶段提供更多的选择,如视图的重写、子查询的合并转换等。

查询重写的依据:查询重写的依据,是关系代数。
1关系代数的等价变换规则对查询重写提供了理论上的支持。
2查询重写后,查询优化器可能生成多个连接路径,可以从候选者中择优。

查询优化技术类型:
1语法级:查询语言层的优化,基于语法进行优化。
2代数级:查询使用形式逻辑进行优化,运用关系代数的原理进行优化。
3语义级:根据完整性约束,对查询语句进行语义理解,推知一些可优化的操作。
4物理级:物理优化技术,基于代价估算模型,比较得出各种执行方式中代价最小的。

查询重写是基于语法级、代数级、语义级的优化,可以统一归属到逻辑优化的范畴;基于代价估算模型是物理层面的优化,是从连接路径中选择代价最小的路径的过程。

查询重写思路:
1将过程性查询转换为描述性的查询,如视图重写。
2将复杂的查询(如嵌套子查询、外连接消除、嵌套连接消除)尽可能转换为多表连接查询
3将效率低的谓词转换为等价的效率高的谓词(如等价谓词重写)。
4利用等式和不等式的性质,简化WHERE、HAVING条件。
5如何改进现有查询重写规则的效率,如何发现更多更有效的重写规则,是查询优化的研究内容之一。

常见的查询重写技术类型,每一类都有自己的规则,这些规则没有确定的、统一的规律,但重写的核心一定是“等价转换”,只有等价才能转换,这是需要特别强调的。

1.3Query Optimization Algorithm

什么是查询优化算法?

查询优化,求解给定查询语句的高效执行计划的过程。这样的过程,包括了多种子问题求解,不同的子问题,对应了不同的解决办法,即算法。

什么是查询计划?
查询计划,也称为查询树,它由一系列内部的操作符组成,这些操作符按一定的运算关系构成查询的一个执行方案。
简单说,就是表A和表B先连接得到中间结果,然后再和另外的表C连接得到新的中间方式,直至所有表都被连接完毕。

查询计划,二叉树上的不同结点:
单表结点。考虑单表的数据获取方式:
1直接通过IO获得数据
2通过索引获取数据
3通过索引定位数据的位置后再经过IO到数据块中获取数据

这是一个从物理存储到内存解析成逻辑字段的过程,即符合冯·诺依曼体系结构的要求(外存数据读入内存才能被处理)

两表结点(两表连接结点)
考虑两表以何种方式连接、代价有多大、连接路径有哪些等。表示的是内存中的元祖,怎么进行元祖间的连接。此时,元祖通常已经存在于内存,直接使用即可。这是一个完成用户语义的逻辑操作,但是只是局部操作,只涉及两个具体的关系。完成用户全部语义(用户连接的语义),需要配合多表的连接顺序操作。

不同的连接算法导致的连接效率不同,如数据量大可使用嵌套连接,数据如果有序可使用归并连接等。

多表结点。
考虑多表连接顺序如何构成代价最少的“执行计划”。决定是AB先连接还是BC先连接,这是一个比较花费大小的运算。如果太多的连接方式被判断,也会导致效率问题。

多个关系采用不同次序进行连接,花费的CPU资源、内存资源差异可能比较大。
许多数据库采用左深树、右深树、紧密树三种方式或其中一部分对多表进行连接得到多种连接路径。

生成最优查询计划的策略:
1基于规则优化。
根据经验或一些已经探知或被证明有效的方式,定义为“规则”(如根据关系代数得知的规则、根据经验得知的规则等),用这些规则化简单查询计划生成过程中符合可被化简的操作,使用启发式规则排除一些明显不好的存取路径,这就是基于规则的优化。
2基于代价优化
根据一个代价评估模型,在生成查询计划的过程中,计算每条存储路径(存取路径主要包括上述三个”关系结点“)的花费,然后选择代价最小的作为子路径,这样直至所有表连接完毕得到一个完整的路径。
代价计算公式:
总代价=CPU代价+IO代价
主流数据库都采用了基于代价策略进行优化的技术。

主流数据库对于基于规则和基于代价的技术,都在使用~
基于规则优化具有操作简单且能快速确定连接方式的优点,但这种方法只是排除了一部分不好的可能,所以得到的结果未必是最好的;
基于代价优化,是对各种可能的情况进行量化比较,从而可以得到花费最小的情况,但如果组合情况比较多则花费的判断时间就会很多

查询优化器的实现,多是两种优化策略组合使用。

查询优化为什么要并行?
传统单机数据库系统中,给定一个查询(Query),查询优化算法只需找到查询的一个具有最小执行花费的执行计划,这样的计划必定具有最快的响应时间。
在并行数据库系统中,查询优化的目标是寻找具有最小响应时间的查询执行计划。者需要把查询工作分解为一些可以并行运行的子工作。一些商业数据库提供了并行查询功能,用以优化查询执行操作。

查询优化并行的条件:
一个查询能否并行执行,取决于多种因素:
1系统中的可用资源(如内存、高速缓存中的数据量等)。
2CPU的数目。
3运算中的特定代数运算符。

如A、B、C、D四个表进行连接,每个表的单表扫描可以并行进行;在生成四个表连接的查询计划过程中,可以选择A和B连接的同时C和D进行连接,这样连接操作能并行运行(操作间并行)。

不同商业数据库,对查询并行的实现也不尽相同。

在同一个SQL内,查询并行可以分为:
1操作内并行。将同一操作如单表扫描操作、两表连接操作、排序操作等分解成多个独立的子操作,由不同的CPU同时执行。
2操作间并行。一条SQL查询语句可以分解成多个子操作,由多个CPU执行。

Distributrd Query Optimization在分布式数据库系统中,查询策略优化是查询优化的重点。
主要是数据传输策略,A、B两结点的数据进行连接,是A结点数据传输到B结点或者是从B到A或是先各自进行过滤然后再传输等,和局部处理优化(传统的单结点数据库的查询优化技术)

在查询优化策略中,数据的通信开销是优化算法考虑的主要因素。分布式查询优化以减少传输的次数和数据量作为查询优化的目标。

分布式数据库系统中的代价估算模型,除了考虑CPU代价和I/O代价外,还要考虑通过网络在结点间传输数据的代价。这是分布式并行查询优化技术与传统单结点数据系统最大的不同之处。

在分布式数据库系统中,代价估算模型为:总代价=I/O代价+CPU代价=通信代价。

数据库查询优化技术(一):数据库与关系代数相关推荐

  1. mysql数据库查询优化建议_mysql数据库查询优化的24条建议

    MySQL是一个强大的开源数据库.随着MySQL上的应用越来越多,MySQL逐渐遇到了瓶颈.这里提供一些关于Mysql 数据库查询优化的24条优化建议,仅供参考. Mysql 查询优化 1.使用慢查询 ...

  2. (数据库系统概论|王珊)第十章数据库恢复技术-第四、五、六、七节:数据库恢复技术和数据库镜像

    文章目录 一:数据库恢复的实现技术 (1)数据转储(备份) A:转储的分类 ①:按照系统是否运行事物时分类 ②:按转储的范围分类 (2)登记日志文件 A:日志文件的内容 B:日志文件的作用 C:登记日 ...

  3. SQL Server中的查询优化技术:数据库设计和体系结构

    描述 (Description) One of the best ways to optimize performance in a database is to design it right th ...

  4. python数据库查询优化_Python操作数据库-查询优化

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  5. 数据库查询优化器,RBO优化规则介绍及示例

    数据库查询优化器是针对于sql经过解析后生成的ast表达式树的. 目的是能够降低sql执行计算量,简化计算. 传统数据库中,查询优化是很复杂的,大体上可以分为RBO和CBO,其中CBO的收益性不确定, ...

  6. 数据库防护技术对比分析

    过去,信息安全工作主要围绕着网络层.主机层等边界防护采取了一系列的安全措施,已建立起相对安全的数据应用环境,但由于技术局限和相关安全产品匮乏等原因,数据库安全建设一直未能得到有效开展,这就造成了数据能 ...

  7. oracle数据库并行数限制,Oracle数据库并行处理技术详解(上)

    Oracle数据库并行处理技术是数据库的一项核心技术,它使组织能够高效地管理和访问TB级的数据.如果不能提供高效的Oracle数据库并行处理技术,这些大型数据库(通常用于数据仓库但也越来越多地出现在业 ...

  8. 数据库恢复技术(事物、三种更新策略以及恢复策略)

    数据库恢复技术(事物.三种更新策略以及恢复策略) 数据库恢复所要达到的目标 数据库为了达到目标的恢复策略 事务和日志的基本内容 事务的基本内容 日志的基本内容 更新数据库规则和三种更新策略 数据库更新 ...

  9. 第10章 数据库恢复技术 | 数据库知识点整理

    第10章 数据库恢复技术 了解 数据库的一致性状态 数据库运行中可能产生的故障类型,它们如何影响事务的正常执行,如何破坏数据库数据 数据转储的概念及分类 数据库的镜像功能 掌握 事务的基本概念和事务的 ...

最新文章

  1. Ubuntu 安装 Etcd
  2. 从产品经理到创业者如何拿到第一个1000万融资
  3. 微信小程序中显示空格
  4. 2021年12月2日星期四的 Hybris Eclipse 导入尝试
  5. html scale方法的作用,HTML Canvas scale() 方法
  6. 科研|我最煎熬的学术时刻,是耗时3年完成了一篇论文
  7. mysql null 走索引_mysql 索引列为Null的走不走索引及null在统计时的问题
  8. 零基础轻松学python pdf 小码哥_零基础轻松学Python
  9. 调试系列2:bugreport实战篇
  10. 使用 Fiddler 分析网页加载过程
  11. sqlserver数据库替换字段的部分字符串
  12. Win 10间歇性卡顿问题
  13. mysql创建视图的sql语句_MySQL数据库创建视图
  14. 使用fusion app制作b站app
  15. 【C++】Web服务器项目所用到的函数详解
  16. js字符串的拼接,用逗号隔开
  17. C语言负整数在内存中的存储
  18. 玩转微信 | 炫酷的聊天满屏掉爱心系列,赶紧收藏
  19. uint8_t / uint16_t / uint32_t /uint64_t 是什么数据类型 - 大总结,看完全明白了
  20. 阿里云ECS mysql安装和远程连接

热门文章

  1. 各浏览器websocket最大连接数
  2. 三种简单排序算法---冒泡排序,简单选择排序,直接插入排序
  3. CSS中的浮动float
  4. 再复杂的架构图,也能轻松搞定!附教程+工具
  5. Intouch制作报表和导出Excel(手把手敲代码)
  6. c语言中main函数是什么
  7. Pandas+Pyecharts | 山东省高考考生数据分析可视化
  8. 2013 VMware官方技术大讲堂 超清视频教程 汇总 下载
  9. 某次通用型漏洞挖掘思路分享
  10. Android图像处理之画笔特效处理