zoukankan      html  css  js  c++  java
  • MySql学习(五) —— 数据库优化理论篇(一)

     

    一、数据库管理系统

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

    衡量是否是数据库的标准:

     ACID:是指在数据库管理系统(DBMS)中事务所具有的四个特性:

      1) 原子性(Atomicity)  

      2) 一致性(Consistency)

      3)隔离性(Isolation)

      4)持久性(Durability)

     

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

     

    2、关系代数:

      在数学中,关系代数是支持叫做逆反(converse)的对合一运算的剩余布尔代数。激发关系代数的例子是在集合X上的所有二元关系的代数,带有R-S被解释为平常的二元关系复合。

      在数据库中,关系代数是一阶逻辑的分支,是闭合于运算下的关系的集合。运算作用于一个或多个关系上来生成一个关系。关系代数是计算机科学的一部分。

      在纯数学中的关系代数是有关于数理逻辑和集合论的代数结构。

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

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

      数据库关系代数的六个运算:选择、投影、笛卡尔积(也叫"叉积"或"交叉连接")、并集、差积、重命名;

        

     

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

     

    二、数据库调优

    1、查询优化技术:

      数据库查询优化技术主要包括查询重用技术、查询重写规则、查询算法优化技术、并行查询优化技术、分布式查询优化技术、及其它方面(如框架结构)的优化技术,这6项技术构成了一个"广义的数据库查询优化"的概念。

      从优化的内容角度看,查询优化又分为代数优化和非代数优化,或称为逻辑优化或物理优化。逻辑优化主要依据关系代数的等价变换做一些逻辑变换;物理优化主要根据数据读取、表连接方式、表连接顺序、排序等技术对查询进行优化。"查询重写规则"属于逻辑优化,运用了关系代数和启发式规则;"查询算法优化"属于物理优化,运用了基于代价估算的多表连接算法求解最小花费的技术。

     

    2、数据库调优(Database Tuning):

      数据库调优可以使数据库应用运行得更快,其目标是使数据库有更高的吞吐量(在单位时间内完成的事务越多越好)、更短的响应时间(每一个事务响应的时间越短越好)。

      被调优的对象是整个数据库管理系统总体。

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

     

    3、数据库调优的方式:

      1)人工调优:主要依赖于人,效率低下;要求操作者完全理解常识所依赖的原理,还需要对应用、数据库管理系统、操作系统以及硬件有广泛而深刻的理解。

      2)基于案例的调优:总结经典案例情况中数据库参数的推荐配置值、数据逻辑层设计等情况,从而为用户的调优工作提供一定的参考和借鉴。但这种方式忽略了系统的动态性和不同系统间存在的差异。

      3)自调优:为数据库系统建立一个模型,根据"影响数据库系统性能效率的因素",数据库系统自动进行参数配置。

     

    4、数据库调优主要分为五个阶段:

      1)第一阶段:需求分析期,应用情况的估算、系统选型策略。

      2)第二阶段:项目设计期,数据模型的设计。

      3)第三阶段:开发期,SQL设计、数据库功能的启用。

      4)第四阶段:测试与运行,数据库功能的启用、模型系统预运行、系统监控与分析。

      5)第五阶段:上线与维护,系统监控与分析。

     

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

      1)应用情况的估算:应用的使用方式(把业务逻辑转换为数据库的读写分布逻辑,以是读多写少还是读写均衡等来区分OLTP和OLAP;应用对数据库的并发情况、并发是否可以池化等)、数据量、对数据库的压力、峰值压力等做一个预估。

      2)系统选型策略:确定什么样的数据库可以适用应用需求,并确定数据库是使用开源的还是商业的,是集使用群还是单机的系统,同时对操作系统、中间件、硬件、网络等进行选型。

      3)数据模型的设计:主要是根据业务逻辑设计,从几个角度考虑表的逻辑结构,内容如下:

        a)E-R模型设计:遵循E-R模型设计原理。但偶尔的适当程度的非规范化可以改善系统查询性能。

        b)数据逻辑分布策略:目的是减少数据请求的不必要的数据量,把用户需要的数据返回;可用的技术如分区、用E-R模型分表等(如互联网企业典型的用法,根据业务的不同,进行分库、分表等操作)。

        c)数据物理存储策略:目的是减少IO,如启用压缩技术、把索引和表数据的存储分开,不同的表数据分布于不同的表空间,不同的表空间分布在不同的物理存储上(尤其是读写量大的表空间分布在不同的物理存储上)、日志、索引和数据分布在不同的物理存储上等。

        d)索引:在查询频繁的对象上建立合适的索引,使索引的正效应大于负效应(索引的维护存在消耗)。

      4)SQL设计:编写正确的、查询效率高的SQL语句。这主要依据"查询重写规则",编写语句的过程中要注意,要有意识地保障SQL能利用到索引。

      5)数据库功能的启用:数据库为提高性能提供了一些功能,可合理使用。

        a)查询重用:根据实际情况进行配置,可缓存查询执行计划、查询结果等。

        b)数据库参数的设置:可设置合适的参数如数据缓冲区等。

      6)模型系统预运行。在备用系统上模拟实际运行环境,加大压力进行系统测试,提前发现问题。

      7)系统监控与分析:在工业环境下,加强对系统的运行监控和日常的分析工作,具体如下:

        a)应用系统表现:收集用户对应用系统的使用意见、系统存在的问题等。

        b)OS环境监控:实时监控CPU、内存、IO等,并对比实时情况与 历史正常情况等。

        c)数据库内部状况监控:一些数据库提供系统表、视图、工具等手段,向用户提供数据库运行过程中内部状况的信息,如锁的信息,这些都需要实时监控,并对比实时情况与历史正常情况等。

        d)日志分析:在数据库的日志、操作系统的日志中找出异常事件,定位问题。

     

    三、查询优化

    1.查询重用

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

      查询重用技术主要集中在两个方面:

        a) 查询结果的重用:在缓存区中分配一块缓存块,存放该SQL语句文本和最后的结果集,当同样的SQL输入时,直接把结果返回。查询结果的重用技术节约了查询计划生成时间,减少了查询执行全过程的资源消耗。

        b) 查询计划的重用:缓存一条查询语句的执行计划及其相应语法树结构。查询计划的重用技术减少了查询计划生成的时间和资源消耗。

      查询重用技术利弊:

        a) 优点:节约了CPU和IO消耗。在实际的使用过程中,趋利避害,根据实际情况选用。

        b) 缺点:结果集很大的话会消耗很大的内存资源,同样的SQL不同用户获取的结果集可能不同。

     

    2.查询优化技术类型

      a) 语法级:查询语言层的优化,基于语法进行优化。

      b) 代数级:查询使用形式逻辑进行优化,运用关系代数的原理进行优化。

      c) 语义级:根据完整性约束,对查询语句进行语义理解,推知一些可优化的操作。

      d) 物理级:物理优化技术,基于代价估算模型,比较得出各种执行方式中代价最小的。

     

    3.查询重写

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

      查询重写的两个目标:

        a) 将查询转换为等价的效率更高的形式,例如将效率低的谓词转换为效率高的谓词、消除重复条件等。

        b) 尽量将查询重写为等价、简单且不受表顺序限制的形式,为物理查询优化阶段提供更多的选择,如视图的重写、子查询的合并转换等。

      查询重写的依据:

        查询重写的依据是关系代数

        a) 关系代数的等价变换规则对查询重写提供了理论上的支持。

        b) 查询重写后,查询优化器可能生成多个连接路径,可以从候选者中择优。 

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

      查询重写思路:

        a) 将过程性查询转换为描述性查询,如视图重写。

        b) 将复杂的查询(如嵌套子查询、外连接消除、嵌套连接消除)尽可能转换为多表连接查询。

        c) 将效率低的谓词转换为等价的效率高的谓词(如等价谓词重写)。

        d) 利用等式和不等式的性质,简化where、having条件。

     

    4.查询优化算法

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

      

    5.查询计划

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

    • 查询计划,二叉树上的不同节点:

        a) 单表节点:

          考虑单表的数据获取方式:

          1)直接通过IO获得数据。

          2)通过索引获取数据。

          3)通过索引定位数据的位置后再经过IO到数据块中获取数据。

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

        b) 两表节点(两表连接节点)

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

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

        c) 多表节点

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

          2)多个关系采用不同次序进行连接,花费的CPU资源、内存资源差异可能较大

          3)许多数据库采用左深树、右深树、紧密树三种方式或其中一部分对多表进行连接得到多种连接路径。

    • 生成最优查询计划的策略:

        a)基于规则优化:根据经验或一些已经探知或被证明有效的方式,定义为"规则"(如根据关系代数得知的规则、根据经验得知的规则等),用这些规则化简查询计划生成过程中符合可被简化的操作,使用启发式规则排除一些明显不好的存取路径,这就是基于规则的优化。

        b)基于代价优化:根据一个代价评估模型,在生成查询计划的过程中,计算每条存取路径(存取路径主要包括上述三个关系节点)的花费,然后选择代价最小的作为子路径,这样直至所有表连接完毕得到一个完整的路径。

          代价计算公式:总代价 = CPU代价 + IO代价

        c)主流数据库对于基于规则和基于代价的技术,都在使用。

          基于规则优化具有操作简单且能快速确定连接方式的优点,但这种方法只是排除了一部分不好的可能,所以得到的结果未必是最好的。

          基于代价优化,是对各种可能的情况进行量化比较,从而可以得到花费最小的情况,但如果组合情况比较多则花费的判断时间就会很多。

          查询优化器的实现,多是两种优化策略组合使用,如MySql的PostgreSQL就采取了基于规则和代价估算的查询优化策略。

    • 查询优化为什么要并行?

          a)传统单机数据库系统中,给定一个查询(Query),查询优化算法只需找到查询的一个具有最小执行花费的执行计划,这样的计划必定具有最快的响应时间。

        b)在并行数据库系统中,查询优化的目标是寻找具有最小响应时间的查询执行计划,这需要把查询工作分解为一些可以并行运行的子工作。一些商业数据库提供了并行查询的功能,用以优化查询执行操作。

    • 查询优化并行的条件

        a)系统中的可用资源(如内存,高速缓存中的数据量等)

        b)CPU的数目

        c)运算中的特定代数运算符

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

    • 在同一个SQL内,查询并行可以分为:

        a)操作内并行:将同一操作如单表扫描操作、两表连接操作、排序操作等分解成多个独立的子操作,由不同的CPU同时执行。

        b)操作间并行:一条SQL查询语句可以分解成多个子操作,由多个CPU执行。

    • 在分布式数据库系统中,查询策略优化是查询优化的重点

        主要是数据传输策略,(A、B两节点的数据进行连接,是A节点数据传输到B节点或是从B到A或是先各自进行过滤然后再传输等) 和局部处理优化(传统的单节点数据库的查询优化技术)    

      在查询优化策略中,数据的通信开销是优化算法考虑的主要因素。分布式查询优化以减少传输的次数和数据量作为查询优化的目标。  分布式数据库系统中的代价估算模型,除了考虑CPU代价和IO代价外,还要考虑通过网络在节点间传输数据的代价。这是分布式并行查询优化技术与传统单节点数据库系统最大不同之处。

      在分布式数据库系统中,代价估算模型为: 总代价 = IO代价 + CPU代价 + 通信代价  (通信代价通常会大于IO代价和CPU代价)

     

    四、逻辑查询优化 

      1.查询的基本操作

        a)选择操作:对应的是限制条件(=, >, < 等),操作对象是二维表中的行。

          优化方式:选择操作下推 (如A.a=B.a AND A.a=1 可转换成A.a=1 AND B.a=1,这样就将A、B表的选择条件下推到各自对应的表中去)。

          目的:尽量减少连接操作前的元组数,使得中间临时关系尽量少(元组少,连接得到的元组数就少)。

            好处:这样可能减少IO和CPU的消耗、节约内存空间。

        b)投影操作:对应的SELECT查询的目的列对象。

          优化方式:投影操作下推

          目的:尽量减少连接操作前的列数,使得中间临时关系尽量小(注意:选择操作是使元组的个数“尽量少”,投影操作是使一条元组“尽量小”)。

          好处:这样虽然不能减少IO (多数数据库存储方式是行存储,元组是读取的最基本单位,所以要想操作列则必须读取一行数据),但可以减少连接后的中间关系的元组大小,节约内存空间。

        c)连接操作:对应的是连接条件,表示两个表连接的条件。

          连接操作涉及两个子问题:

            1)多表连接中每个表被连接的顺序决定着效率:如果一个查询语句只有一个表,则这样的语句很简单;但如果有多个表,则会涉及表之间以什么样的顺序连接最高效。

            2)多表连接每个表被连接的顺序被用户语义定义:查询语句多表连接有着不同的语义(如是 笛卡尔积、内连接、左右连接等),这决定着表之间的前后连接次序是不能随意更换的,否则,结果集中数据是不同的。因此,表的前后连接次序是不能随意交换的。  

      2.使用explain来获取select的详细信息

        语法:EXPLAIN [explain_type] <select expression>;    explain_type 可以有如下:extended | partitions | (format=traditional | json);

        EXPLAIN命令,用于显示SQL语句的查询执行计划。EXPLAIN为用于SELECT语句中的每个表返回一行信息。

        EXPLAIN EXTENDED命令:显示SQL语句的详细的查询执行计划;之后可以通过"SHOW WARNINGS"命令查看详细信息。

        SHOW WARNINGS命令:可以查看MySQL优化器优化后的SQL语句。

        EXPLAIN PARTITIONS命令:显示SQL语句的带有分区表信息的查询执行计划。

        EXPLAIN命令的输出格式:

          TRADITIONAL:传统类型,按行隔离,每行标识一个自操作。

          JSON:JSON格式。

     

      3.逻辑查询优化包括的技术

        a)子查询优化  b)视图重写  c)等价谓词重写  d)条件简化  e)外连接消除  f)嵌套连接消除  g)连接消除  h)语义优化  i)非SPJ优化

       

     

  • 相关阅读:
    C#RSA的研究,C#、Java互通
    .NetCore接入Log4Net
    asp.net core 5.0 使用log4net
    C# 根据出生年月 计算天数/计算X岁X月X天字符串
    DateTime? 转对象出错的问题
    WPF新的窗口返回值的方式
    C# Post
    数据库跨服务器更新表内容
    sql server 初学乱记
    sql server 2008/k3 cloud 安装踩雷
  • 原文地址:https://www.cnblogs.com/chiangchou/p/mysql-5.html
Copyright © 2011-2022 走看看