精华内容
下载资源
问答
  • GBase8s数据库调优-1.doc

    2020-08-24 17:41:26
    影响CPU使用率的配置...Online 配置文件onconfig中的下列参数对CPU的利用率有明显的影响: • NUMCPU • SINGLE_CPU_VP • MULTIPROCESSOR • AFF_NPROCS • AFF_SPROC • NUMAIOVPS • OPTCOMPAND • NETTYPE
  • 数据库调优(一)

    2019-12-03 11:58:27
    你可以思考一下,如何你是一名 DBA 或者开发人员,都有哪些维度可以进行数据库调优? 其实关于数据库调优的知识点非常分散。不同的 DBMS,不同的公司,不同的职位,不同的项目遇到的问题都不尽相同。为了能让你对...

    从这一篇开始,我们正式进入了 SQL 性能优化篇。在这一模块中,我们会关注如何提升 SQL 查询的效率。你可以思考一下,如何你是一名 DBA 或者开发人员,都有哪些维度可以进行数据库调优?

    其实关于数据库调优的知识点非常分散。不同的 DBMS,不同的公司,不同的职位,不同的项目遇到的问题都不尽相同。为了能让你对数据库调优有一个整体的概览,我把这些知识点做了一个梳理,希望能对你有一些帮助。

    今天的课程你需要掌握以下几个方面的内容:

    1. 数据库调优的目标是什么?
    2. 如果要进行调优,都有哪些维度可以选择?
    3. 如何思考和分析数据库调优这件事?

    数据库调优的目标

    简单来说,数据库调优的目的就是要让数据库运行得更快,也就是说响应的时间更快,吞吐量更大。

    不过随着用户量的不断增加,以及应用程序复杂度的提升,我们很难用“更快”去定义数据库调优的目标,因为用户在不同时间段访问服务器遇到的瓶颈不同,比如双十一促销的时候会带来大规模的并发访问;还有用户在进行不同业务操作的时候,数据库的事务处理和 SQL 查询都会有所不同。因此我们还需要更加精细的定位,去确定调优的目标。

    如何确定呢?一般情况下,有两种方式可以得到反馈。

    用户的反馈

    用户是我们的服务对象,因此他们的反馈是最直接的。虽然他们不会直接提出技术建议,但是有些问题往往是用户第一时间发现的。我们要重视用户的反馈,找到和数据相关的问题。

    日志分析

    我们可以通过查看数据库日志和操作系统日志等方式找出异常情况,通过它们来定位遇到的问题。

    除了这些具体的反馈以外,我们还可以通过监控运行状态来整体了解服务器和数据库的运行情况。

    服务器资源使用监控

    通过监控服务器的 CPU、内存、I/O 等使用情况,可以实时了解服务器的性能使用,与历史情况进行对比。

    数据库内部状况监控

    在数据库的监控中,活动会话(Active Session)监控是一个重要的指标。通过它,你可以清楚地了解数据库当前是否处于非常繁忙的状态,是否存在 SQL 堆积等。

    除了活动会话监控以外,我们也可以对事务、锁等待等进行监控,这些都可以帮助我们对数据库的运行状态有更全面的认识。

    对数据库进行调优,都有哪些维度可以进行选择?

    我们需要调优的对象是整个数据库管理系统,它不仅包括 SQL 查询,还包括数据库的部署配置、架构等。从这个角度来说,我们思考的维度就不仅仅局限在 SQL 优化上了。

    听起来比较复杂,但其实我们可以一步步通过下面的步骤进行梳理。

    第一步,选择适合的 DBMS

    我们之前讲到了 SQL 阵营和 NoSQL 阵营。在 RDBMS 中,常用的有 Oracle,SQL Server 和 MySQL 等。如果对事务性处理以及安全性要求高的话,可以选择商业的数据库产品。这些数据库在事务处理和查询性能上都比较强,比如采用 SQL Server,那么单表存储上亿条数据是没有问题的。如果数据表设计得好,即使不采用分库分表的方式,查询效率也不差。

    除此以外,你也可以采用开源的 MySQL 进行存储,我们之前讲到过,它有很多存储引擎可以选择,如果进行事务处理的话可以选择 InnoDB,非事务处理可以选择 MyISAM。

    NoSQL 阵营包括键值型数据库、文档型数据库、搜索引擎、列式存储和图形数据库。这些数据库的优缺点和使用场景各有不同,比如列式存储数据库可以大幅度降低系统的 I/O,适合于分布式文件系统和 OLAP,但如果数据需要频繁地增删改,那么列式存储就不太适用了。原因我在答疑篇已经讲过,这里不再赘述。

    DBMS 的选择关系到了后面的整个设计过程,所以第一步就是要选择适合的 DBMS。如果已经确定好了 DBMS,那么这步可以跳过,但有时候我们要根据业务需求来进行选择。

    第二步,优化表设计

    选择了 DBMS 之后,我们就需要进行表设计了。RDBMS 中,每个对象都可以定义为一张表,表与表之间的关系代表了对象之间的关系。如果用的是 MySQL,我们还可以根据不同表的使用需求,选择不同的存储引擎。除此以外,还有一些优化的原则可以参考:

    1. 表结构要尽量遵循第三范式的原则(关于第三范式,我在后面章节会讲)。这样可以让数据结构更加清晰规范,减少冗余字段,同时也减少了在更新,插入和删除数据时等异常情况的发生。
    2. 如果分析查询应用比较多,尤其是需要进行多表联查的时候,可以采用反范式进行优化。反范式采用空间换时间的方式,通过增加冗余字段提高查询的效率。
    3. 表字段的数据类型选择,关系到了查询效率的高低以及存储空间的大小。一般来说,如果字段可以采用数值类型就不要采用字符类型;字符长度要尽可能设计得短一些。针对字符类型来说,当确定字符长度固定时,就可以采用 CHAR 类型;当长度不固定时,通常采用 VARCHAR 类型。

    数据表的结构设计很基础,也很关键。好的表结构可以在业务发展和用户量增加的情况下依然发挥作用,不好的表结构设计会让数据表变得非常臃肿,查询效率也会降低。

    第三步,优化逻辑查询

    当我们建立好数据表之后,就可以对数据表进行增删改查的操作了。这时我们首先需要考虑的是逻辑查询优化,什么是逻辑查询优化呢?

    SQL 查询优化,可以分为逻辑查询优化和物理查询优化。逻辑查询优化就是通过改变 SQL 语句的内容让 SQL 执行效率更高效,采用的方式是对 SQL 语句进行等价变换,对查询进行重写。重写查询的数学基础就是关系代数。

    SQL 的查询重写包括了子查询优化、等价谓词重写、视图重写、条件简化、连接消除和嵌套连接消除等。

    比如我们在讲解 EXISTS 子查询和 IN 子查询的时候,会根据小表驱动大表的原则选择适合的子查询。在 WHERE 子句中会尽量避免对字段进行函数运算,它们会让字段的索引失效。

    我举一个例子,假设我想对商品评论表中的评论内容进行检索,查询评论内容开头为 abc 的内容都有哪些,如果在 WHERE 子句中使用了函数,语句就会写成下面这样:

    SELECT comment_id, comment_text, comment_time FROM product_comment WHERE SUBSTRING(comment_text, 1,3)='abc'
    

    我们可以采用查询重写的方式进行等价替换:

    SELECT comment_id, comment_text, comment_time FROM product_comment WHERE comment_text LIKE 'abc%'
    

     

    你会发现在数据量大的情况下,第二条 SQL 语句的查询效率要比前面的高很多,执行时间为前者的 1/10。

    第四步,优化物理查询

    物理查询优化是将逻辑查询的内容变成可以被执行的物理操作符,从而为后续执行器的执行提供准备。它的核心是高效地建立索引,并通过这些索引来做各种优化。

    但你要知道索引不是万能的,我们需要根据实际情况来创建索引。那么都有哪些情况需要考虑呢?

    1. 如果数据重复度高,就不需要创建索引。通常在重复度超过 10% 的情况下,可以不创建这个字段的索引。比如性别这个字段(取值为男和女)。
    2. 要注意索引列的位置对索引使用的影响。比如我们在 WHERE 子句中对索引字段进行了表达式的计算,会造成这个字段的索引失效。
    3. 要注意联合索引对索引使用的影响。我们在创建联合索引的时候会对多个字段创建索引,这时索引的顺序就很重要了。比如我们对字段 x, y, z 创建了索引,那么顺序是 (x,y,z) 还是 (z,y,x),在执行的时候就会存在差别。
    4. 要注意多个索引对索引使用的影响。索引不是越多越好,因为每个索引都需要存储空间,索引多也就意味着需要更多的存储空间。此外,过多的索引也会导致优化器在进行评估的时候增加了筛选出索引的计算时间,影响评估的效率。

    查询优化器在对 SQL 语句进行等价变换之后,还需要根据数据表的索引情况和数据情况确定访问路径,这就决定了执行 SQL 时所需要消耗的资源。SQL 查询时需要对不同的数据表进行查询,因此在物理查询优化阶段也需要确定这些查询所采用的路径,具体的情况包括:

    1. 单表扫描:对于单表扫描来说,我们可以全表扫描所有的数据,也可以局部扫描。
    2. 两张表的连接:常用的连接方式包括了嵌套循环连接、HASH 连接和合并连接。
    3. 多张表的连接:多张数据表进行连接的时候,顺序很重要,因为不同的连接路径查询的效率不同,搜索空间也会不同。我们在进行多表连接的时候,搜索空间可能会达到很高的数据量级,巨大的搜索空间显然会占用更多的资源,因此我们需要通过调整连接顺序,将搜索空间调整在一个可接收的范围内。

    物理查询优化是在确定了逻辑查询优化之后,采用物理优化技术(比如索引等),通过计算代价模型对各种可能的访问路径进行估算,从而找到执行方式中代价最小的作为执行计划。在这个部分中,我们需要掌握的重点是对索引的创建和使用。

    第五步,使用 Redis 或 Memcached 作为缓存

    除了可以对 SQL 本身进行优化以外,我们还可以请外援提升查询的效率。

    因为数据都是存放到数据库中,我们需要从数据库层中取出数据放到内存中进行业务逻辑的操作,当用户量增大的时候,如果频繁地进行数据查询,会消耗数据库的很多资源。如果我们将常用的数据直接放到内存中,就会大幅提升查询的效率。

    键值存储数据库可以帮我们解决这个问题。

    常用的键值存储数据库有 Redis 和 Memcached,它们都可以将数据存放到内存中。

    从可靠性来说,Redis 支持持久化,可以让我们的数据保存在硬盘上,不过这样一来性能消耗也会比较大。而 Memcached 仅仅是内存存储,不支持持久化。

    从支持的数据类型来说,Redis 比 Memcached 要多,它不仅支持 key-value 类型的数据,还支持 List,Set,Hash 等数据结构。 当我们有持久化需求或者是更高级的数据处理需求的时候,就可以使用 Redis。如果是简单的 key-value 存储,则可以使用 Memcached。

    通常我们对于查询响应要求高的场景(响应时间短,吞吐量大),可以考虑内存数据库,毕竟术业有专攻。传统的 RDBMS 都是将数据存储在硬盘上,而内存数据库则存放在内存中,查询起来要快得多。不过使用不同的工具,也增加了开发人员的使用成本。

    第六步,库级优化

    库级优化是站在数据库的维度上进行的优化策略,比如控制一个库中的数据表数量。另外我们可以采用主从架构优化我们的读写策略。

    如果读和写的业务量都很大,并且它们都在同一个数据库服务器中进行操作,那么数据库的性能就会出现瓶颈,这时为了提升系统的性能,优化用户体验,我们可以采用读写分离的方式降低主数据库的负载,比如用主数据库(master)完成写操作,用从数据库(slave)完成读操作。

    除此以外,我们还可以对数据库分库分表。当数据量级达到亿级以上时,有时候我们需要把一个数据库切成多份,放到不同的数据库服务器上,减少对单一数据库服务器的访问压力。如果你使用的是 MySQL,就可以使用 MySQL 自带的分区表功能,当然你也可以考虑自己做垂直切分和水平切分。

    什么情况下做垂直切分,什么情况下做水平切分呢?

    如果数据库中的数据表过多,可以采用垂直分库的方式,将关联的数据表部署在一个数据库上。

    如果数据表中的列过多,可以采用垂直分表的方式,将数据表分拆成多张,把经常一起使用的列放到同一张表里。

    如果数据表中的数据达到了亿级以上,可以考虑水平切分,将大的数据表分拆成不同的子表,每张表保持相同的表结构。比如你可以按照年份来划分,把不同年份的数据放到不同的数据表中。2017 年、2018 年和 2019 年的数据就可以分别放到三张数据表中。

    采用垂直分表的形式,就是将一张数据表分拆成多张表,采用水平拆分的方式,就是将单张数据量大的表按照某个属性维度分成不同的小表。

    但需要注意的是,分拆在提升数据库性能的同时,也会增加维护和使用成本。

    我们该如何思考和分析数据库调优这件事

    做任何事情之前,我们都需要确认目标。在数据库调优中,我们的目标就是响应时间更快,吞吐量更大。利用宏观的监控工具和微观的日志分析可以帮我们快速找到调优的思路和方式。

    虽然每个人的情况都不一样,但我们同样需要对数据库调优这件事有一个整体的认知。在思考数据库调优的时候,可以从三个维度进行考虑。

    首先,选择比努力更重要。

    在进行 SQL 调优之前,可以先选择 DBMS 和数据表的设计方式。你能看到,不同的 DBMS 直接决定了后面的操作方式,数据表的设计方式也直接影响了后续的 SQL 查询语句。

    另外,你可以把 SQL 查询优化分成两个部分,逻辑查询优化和物理查询优化。

    虽然 SQL 查询优化的技术有很多,但是大方向上完全可以分成逻辑查询优化和物理查询优化两大块。逻辑查询优化就是通过 SQL 等价变换提升查询效率,直白一点就是说,换一种查询写法执行效率可能更高。物理查询优化则是通过索引和表连接方式等技术来进行优化,这里重点需要掌握索引的使用。

    最后,我们可以通过外援来增强数据库的性能。

    单一的数据库总会遇到各种限制,不如取长补短,利用外援的方式。

    另外通过对数据库进行垂直或者水平切分,突破单一数据库或数据表的访问限制,提升查询的性能。

    本篇文章中涉及到的概念和知识点比较多,也有可能出现纰漏,不过没有关系,我会在在后续的文章中陆续进行讲解。希望这篇文章可以让你站在一个宏观的角度对数据库的调优有系统性的认知,对今后的工作有一些启发。


    你不妨说一下,在日常的工作中你是如何发现数据库性能瓶颈的?又是怎么解决这个问题的?另外我在文章中从 6 个维度阐述了如何对数据库进行调优,前两个维度在于选择,中间两个维度在于 SQL 的查询优化,后两个维度在于外援技术。你可以说一说你对这些维度的理解吗?

    展开全文
  • (一)数据库底层 ... 仅供个人学习使用 数据库(DataBase)是存放用户...通常情况下我们会把数据库数据库管理系统笼统的称为数据库,通常所说的数据库既包括存储用户数据的部分,也包括管理数据库的管理系统。 ...

    (一)数据库底层

    转自:https://blog.csdn.net/m0_38075425/article/details/82256315

    仅供个人学习使用

           数据库(DataBase)是存放用户数据的地方,当用户访问、操作数据库中的数据时,需要数据库管理系统的帮助。数据管理系统的全称是DataBase Management System,简称DBMS。通常情况下我们会把数据库和数据库管理系统笼统的称为数据库,通常所说的数据库既包括存储用户数据的部分,也包括管理数据库的管理系统

           MySQL是一种关系型数据库管理系统,关系型数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。MySQL使用 C和 C++编写,其体积小、速度快、源码开放,如今被应用在大量的中小型应用上。

    1.MySQL架构

    上图为MySQL的逻辑架构图:

    支持接口是第三方语言对数据库的操作接口,这里不再赘述。

    1)连接层

         最上层的连接池是一些连接服务,包含本地sock通信和大多数基于C/S工具实现的类似于TCP/IP的通信。主要完成一些类似于连接处理、授权认证及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全连接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。

    2)服务层

         第二层架构主要完成大多数的核心服务功能,如SQL接口缓存的查询SQL的分析和优化内置函数等。所有跨存储引擎的功能也在这一层实现,如过程、函数等。在该层,服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化如确定查询表的顺序,是否利用索引等,最后生成相应的执行操作。如果是select语句,服务器还会查询内部的缓存,如果缓存空间足够大,这样在频繁读操作的环境中能够很好的提升系统的性能。

    3)引擎层

         存储引擎真正的负责MySQL中数据的存储和提取服务器通过API与存储引擎进行通信,不同的存储引擎具有的特性不同,我们可以根据实际需进行选取。下文将对相关存储引擎进行具体介绍。

    4)存储层

        数据存储层,主要是将数据存储在运行于裸设备的文件系统之上,并完成与存储引擎的交互。

    SQL的执行过程:数据库通常不会被单独使用,而是由其它编程语言通过SQL支持接口调用MySQL,由MySQL处理并返回执行结果。首先,其它编程语言通过SQL支持接口调用MySQL,MySQL收到请求后,会将该请求暂时放在连接池,并由管理服务与工具进行管理。当该请求从等待队列进入到处理队列时,管理器会将该请求传给SQL接口,SQL接口接收到请求后,它会将请求进行hash处理并与缓存中的数据进行对比,如果匹配则通过缓存直接返回处理结果;否则,去文件系统查询:由SQL接口传给后面的解析器,解析器会判断SQL语句是否正确,若正确则将其转化为数据结构。解析器处理完毕后,便将处理后的请求传给优化器控制器,它会产生多种执行计划,最终数据库会选择最优的方案去执行。确定最优执行计划后,SQL语句交由存储引擎处理,存储引擎将会到文件系统中取得相应的数据,并原路返回。

    2.MySQL的存储引擎

    MySQL在5.1版本之前默认存储引擎为MyISAM,在此版本之后为InnoDB。

    1)MyISAM存储引擎

         MyIsam 的存储文件有三个,后缀名分别是 .frm、.MYD、MYI,其中 .frm 是表的定义文件,.MYD 是数据文件,.MYI 是索引文件。MyIsam 只支持表锁,不支持事务。MyIsam 由于有单独的索引文件,在读取数据方面的性能很高。Myisam是以堆结构进行组织数据,其表容易损坏。

    2)InnoDB

         InnoDB 的存储文件有两个,后缀名分别是 .frm 和 .idb,其中 .frm 是表的定义文件,而 idb 是数据文件。InnoDB 中存在表锁和行锁不过行锁是在命中索引的情况下才会起作用。InnoDB 支持事务,且支持四种隔离级别(读未提交、读已提交、可重复读、串行化),默认的为可重复读

    两种存储引擎的对比:从MyISAM和InnoDB的存储文件可看出,MyISAM注重的是对数据的快速读取,但由于MyISAM不支持事务,同时缺乏灵活性。而InnoDB支持事务和行级锁,因此在5.1之后MySQL的默认存储引擎为InnoDB

    3)两大存储引擎的数据结构

         MyISAM和InnoDB两种存储引擎都采用了B+树(有关B+树的概念和由来,请见笔者相关博客)的数据结构,但具体实现方式完全不同。

         MyISAM的B+树实现示例图:

    MyISAM的B+树叶子节点存储的并不是数据,而是数据地址,因此也称为非聚集索引,搜索按照B+树的搜索算法进行。

        InnnDB的B+树实现示例图:

           InnoDB的B+树叶子节点存储的就是数据本身,因此也称为聚集索引。从实现数据结构可知,如采用InnoDB存储引擎,不宜设置过长的主键。另外,使用InnoDB尽量采用自增(自减)的数据为主键,否则,由于叶子结点处直接存储数据的原因(数据即为索引),会造成频繁的B+的分裂合并调整,效率十分低下。从数据结构的实现看出,当读写更新比较频繁,读写一致性要求很高的业务,采用InnoDB更佳。   

    (二)数据库调优

    一.创建索引

    1.要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引

    2.在经常需要进行检索的字段上创建索引,一个表的索引数最好不要超过6个,索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。

    二.避免在索引上使用计算

    在where字句中,如果索引列是计算或者函数的一部分,DBMS的优化器将不会使用索引而使用全表查询

    三.使用预编译查询

    程序中通常是根据用户的输入来动态执行SQL,这时应该尽量使用参数化SQL,这样不仅可以避免SQL注入漏洞攻击,最重要数据库会对这些参数化SQL进行预编译,这样第一次执行的时候DBMS会为这个SQL语句进行查询优化并且执行预编译,这样以后再执行这个SQL的时候就直接使用预编译的结果,这样可以大大提高执行的速度。

    四.调整Where字句中的连接顺序

    DBMS一般采用自下而上的顺序解析where字句,根据这个原理表连接最好写在其他where条件之前,那些可以过滤掉最大数量记录。

    五.尽量将多条SQL语句压缩到一句SQL中

    每次执行SQL的时候都要建立网络连接、进行权限校验、进行SQL语句的查询优化、发送执行结果,这个过程是非常耗时的,因此应该尽量避免过多的执行SQL语句,能够压缩到一句SQL执行的语句就不要用多条来执行。

    六.用where字句替换HAVING字句

    避免使用HAVING字句,因为HAVING只会在检索出所有记录之后才对结果集进行过滤,而where则是在聚合前刷选记录,如果能通过where字句限制记录的数目,那就能减少这方面的开销。HAVING中的条件一般用于聚合函数的过滤,除此之外,应该将条件写在where字句中。

    七.使用表的别名

    当在SQL语句中连接多个表时,请使用表的别名并把别名前缀于每个列名上。这样就可以减少解析的时间并减少哪些有列名歧义引起的语法错误。

    八.用union all替换union

    当SQL语句需要union两个查询结果集合时,即使检索结果中不会有重复的记录,如果使用union这两个结果集同样会尝试进行合并,然后在输出最终结果前进行排序,因此如果可以判断检索结果中不会有重复的记录时候,应该用union all,这样效率就会因此得到提高。

    九.考虑使用“临时表”暂存中间结果

    简化SQL语句的重要方法就是采用临时表暂存中间结果,但是,临时表的好处远远不止这些,将临时结果暂存在临时表,后面的查询就在tempdb中了,这可以避免程序中多次扫描主表,也大大减少了程序执行中“共享锁”阻塞“更新锁”,减少了阻塞,提高了并发性能。但是也得避免频繁创建和删除临时表,以减少系统表资源的消耗。

    十.只在必要的情况下才使用事务begin translation

    SQL Server中一句SQL语句默认就是一个事务,在该语句执行完成后也是默认commit的。其实,这就是begin tran的一个最小化的形式,好比在每句语句开头隐含了一个begin tran,结束时隐含了一个commit。有些情况下,我们需要显式声明begin tran,比如做“插、删、改”操作需要同时修改多个表,要求要么几个表都修改成功,要么都不成功。begin tran 可以起到这样的作用,它可以把若干SQL语句套在一起执行,最后再一起commit。 好处是保证了数据的一致性,但任何事情都不是完美无缺的。Begin tran付出的代价是在提交之前,所有SQL语句锁住的资源都不能释放,直到commit掉。可见,如果Begin tran套住的SQL语句太多,那数据库的性能就糟糕了。在该大事务提交之前,必然会阻塞别的语句,造成block很多。Begin tran使用的原则是,在保证数据一致性的前提下,begin tran 套住的SQL语句越少越好!有些情况下可以采用触发器同步数据,不一定要用begin tran。

    十一.尽量避免使用游标

    尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。

    十二.用varchar/nvarchar 代替 char/nchar

    尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。

    十三.查询select语句优化

    1.任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段

    2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描

    十四.更新Update语句优化

    如果只更改1、2个字段,不要Update全部字段,否则频繁调用会引起明显的性能消耗,同时带来大量日志

    十五. 删除Delete语句优化语句

    使用ROWID

    十六.插入Insert语句优化

    在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果数据量不大,为了缓和系统表的资源,应先create table,然后insert。

    总结:

    优化方向主要有:

    1.索引:在常用列上加入索引(避免全局扫描)、避免在索引列上做计算

    2.sql语句:尽量一条sql、where后面先跟表连接、多where少having、尽量select只查询需要的数据、表别名

    3.预编译查询、临时表、减少使用事务、避免生成日志

     

     

    展开全文
  • Greenplum 数据库调优

    2020-02-28 21:11:59
    Greenplum 数据库调优 目录 Greenplum 数据库调优 1 目录 1 1 Greenplum查询处理回顾 2 1.1 Master 把查询语句分发到segment 2 2 Greenplum数据库调优 3 2.1 系统资源 3 2.2 硬件问题 4 2.3 资源管理 5 ...

    Greenplum 数据库调优

    目录

    Greenplum 数据库调优 1

    目录 1

    1 Greenplum查询处理回顾 2

    1.1 Master 把查询语句分发到segment 2

    2 Greenplum数据库调优 3

    2.1 系统资源 3

    2.2 硬件问题 4

    2.3 资源管理 5

    2.3.1 查看resource queue的参数 5

    2.3.2 设置临时的内存大小 6

    2.3.3 当发生数据溢出时添加内存的大小 6

    2.3.4 受影响的系统的参数 7

    2.3.5 查看一些有用的视图 7

    2.4 统计信息不准确 8

    2.4.1 创建两张表 8

    2.4.2 使用EXPLAIN查看执行计划 8

    2.4.3 使用ANALYZE执行统计信息 9

    2.4.4 以下情况都需要执行ANALYZE 10

    2.5 数据倾斜 10

    2.5.1 数据倾斜实例 10

    2.5.2 使用视图查看表的倾斜 11

    2.5.3 改变数据倾斜问题 11

    2.6 计算倾斜 12

    2.6.1 关联条件倾斜 12

    2.6.2 多计算聚集 12

    2.6.3 减少计算倾斜问题 13

    2.7 数据广播 13

    2.7.1 查看表是不是出现了Broadcast 13

    2.7.2 改变planner之后运行 14

    2.7.3 修改GUC来设定优化器 14

    2.8 多阶段聚集 15

    2.8.1 多阶段聚集关闭的情况 15

    2.8.2 多阶段聚集打开的情况 15

    2.8.3 GUC会影响优化器对多阶段聚集的选择 16

    2.9 分区裁剪 17

    2.9.1 定义分区 17

    2.9.2 使用查询计划查看分区 17

    2.9.2.1 planner 分区 17

    2.9.2.2 ORCA分区 18

    2.9.2.3 最优查询条件 18

    3 一些最佳实战 19

    3.1 最佳实践注意点 19

    1 Greenplum查询处理回顾

    1.1 Master 把查询语句分发到segment

    1、Master接受查询语句并生成查询计划

    2、Master 把查询计划分发到Segment,分发模式有两种分别是Parallel和Targeted

    3、Segment并发在各自本地的数据集上执行计划

    a、Slice : A portion of the plan that segment can work on independently

    b、Gang : Related processes that are working on the same slice of the query plan but on different segments

    4、Master 收集结果并返回给客户端

    2 Greenplum数据库调优

    使用EXPLAIN ANALYZE 查看执行计划

    2.1 系统资源

    按照不同的问题使用不同的shell命令

    2.2 硬件问题

    使用Greenplum自带的gpcheckperf 命令检测硬件问题

    2.3 资源管理

    2.3.1 查看resource queue的参数

    资源管理主要与resource queue中的PRIORITY和MEMORY_LIMIT有关

    2.3.2 设置临时的内存大小

    2.3.3 当发生数据溢出时添加内存的大小

    使用EXPLAIN ANALYZE 查看执行计划时发现Work_mem used(用户开销内存)比Work_mem wanted(用户需要执行的内存)小时,可能数据文件溢出到磁盘上,需要临时添加内存。

    2.3.4 受影响的系统的参数

    2.3.5 查看一些有用的视图

    首先系统视图pg_stat_activity和pg_locks来查看当前是否有锁的等待

    2.4 统计信息不准确

    2.4.1 创建两张表

    2.4.2 使用EXPLAIN查看执行计划

    在以下的计划中可以看出全表扫描了并hash了表t1,并返回rows=1行数据,耗时851.390ms

    2.4.3 使用ANALYZE执行统计信息

    在以下中可以看出执行了analyze后,全表扫描和Hash了t2,返回了rows=33325行数据,耗时553.725ms

    2.4.4 以下情况都需要执行ANALYZE

    2.5 数据倾斜

    2.5.1 数据倾斜实例

    使用EXPLAIN ANALYZE出现以下信息说明执行了3个workers,每个workers平均执行了366666.7行的数据,在seg0上最大执行了1033348行数据,说明大部分的数据都在seg0上,有数据倾斜的现象。

    2.5.2 使用视图查看表的倾斜

    使用gp_skew_coefficients和gp_skew_idle_fractions来查看表的倾斜的情况,其中gp_skew_coefficients是标准偏差除以平均值,值越低越好。gp_skew_idle_fractions是表扫描期间空闲的系统百分比,超过10%的表应该评估表的分布策略。

    2.5.3 改变数据倾斜问题

    使用改变分布键来改变数据倾斜的问题

    2.6 计算倾斜

    2.6.1 关联条件倾斜

    当进行关联条件关联时,两个关连建如果分配不均匀的话可能也会出现倾斜

    2.6.2 多计算聚集

    多计算倾斜就是经过了第一步的处理又经过了第二部的处理,如下例:经过了group by之后有进行了avg计算

    2.6.3 减少计算倾斜问题

    2.7 数据广播

    2.7.1 查看表是不是出现了Broadcast

    2.7.2 改变planner之后运行

    2.7.3 修改GUC来设定优化器

    如果配置了gp_segment_for_planner后,优化器会选择最优的一个来执行

    2.8 多阶段聚集

    2.8.1 多阶段聚集关闭的情况

    以下是把gp_enable_multiphase_agg参数关闭的情况下,耗时13770.833ms,数据库默认的这个参数是打开的。

    2.8.2 多阶段聚集打开的情况

    以下是gp_enable_multiphase_agg打开的情况下,运行了三次聚集,运行耗时6041.057ms

    2.8.3 GUC会影响优化器对多阶段聚集的选择

    如果参数gp_enable_multiphase_agg是打开的,GUC优化器会选择一个最优的优化器来执行。

    2.9 分区裁剪

    2.9.1 定义分区

    2.9.2 使用查询计划查看分区

    2.9.2.1 planner 分区

    2.9.2.2 ORCA分区

    2.9.2.3 最优查询条件

    如果在分区上做一个查询的时候,能在查询过滤条件个分区条件在一起则是最优的查询语句。

    3 一些最佳实战

    3.1 最佳实践注意点

    展开全文
  • mysql数据库调优

    千次阅读 2020-06-11 09:43:40
    面试官一问到数据库调优的,大家就说加索引,除了加索引大家还知道别的么? 或者索引相关的点你全部都知道么?聚簇索引,非聚簇索引,普通索引,唯一索引,change buffer,表锁、行锁、间隙锁以及行锁并发情况下的...

    面试官一问到数据库调优的,大家就说加索引,除了加索引大家还知道别的么?
    或者索引相关的点你全部都知道么?聚簇索引,非聚簇索引,普通索引,唯一索引,change buffer,表锁、行锁、间隙锁以及行锁并发情况下的最大TPS是多少?还有索引为啥会选择错误?这些大家知道嘛?

    在这里插入图片描述
    数据库的组成:
    在这里插入图片描述
    我们所谓的调优也就是在,执行器执行之前的分析器,优化器阶段完成的,那我们开发工作中怎么去调优的呢?
    一般在开发涉及SQL的业务都会去本地环境跑一遍SQL,用explain去看一下执行计划,看看分析的结果是否符合自己的预期,用没用到相关的索引,然后再去线上环境跑一下看看执行时间(这里只有查询语句,修改语句也无法在线上执行)

    • 排除缓存干扰
      因为在MySQL8.0之前我们的数据库是存在缓存这样的情况的,我之前就被坑过,因为存在缓存,我发现我sql怎么执行都是很快,当然第一次其实不快但是我没注意到,以至于上线后因为缓存经常失效,导致rt(Response time)时高时低。
      后面就发现了是缓存的问题,我们在执行SQL的时候,记得加上SQL NoCache去跑SQL,这样跑出来的时间就是真实的查询时间了。
      我说一下为什么缓存会失效,而且是经常失效。
      如果我们当前的MySQL版本支持缓存而且我们又开启了缓存,那每次请求的查询语句和结果都会以key-value的形式缓存在内存中的,大家也看到我们的结构图了,一个请求会先去看缓存是否存在,不存在才会走解析器。
      缓存失效比较频繁的原因就是,只要我们一对表进行更新,那这个表所有的缓存都会被清空,其实我们很少存在不更新的表,特别是我之前的电商场景,可能静态表可以用到缓存,但是我们都走大数据离线分析,缓存也就没用了。
      大家如果是8.0以上的版本就不用担心这个问题,如果是8.0之下的版本,记得排除缓存的干扰。
    • Explain
      最开始提到了用执行计划去分析,我想explain是大家SQL调优都会回答到的吧。
      因为这基本上是写SQL的必备操作,那我现在问大家一个我去阿里面试被问过的一个问题:explain你记得哪些字段,分别有什么含义?
      当时我就回答上来三个,我默认大家都是有数据库基础的,所以每个我这里不具体讨论每个字段,怕大家忘记我贴一遍图大家自己回忆一下。
      在这里插入图片描述
      那我再问大家一下,你们认为统计这个统计的行数就是完全对的么?索引一定会走到最优索引么?
      当然我都这么问了,你们肯定也知道结果了,行数只是一个接近的数字,不是完全正确的,索引也不一定就是走最优的,是可能走错的。
      我的总行数大概有10W行,但是我去用explain去分析sql的时候,就会发现只得到了9.4W,为啥行数只是个近视值呢?
      在这里插入图片描述
      看过基础章节的小伙伴都知道,MySQL中数据的单位都是页,MySQL又采用了采样统计的方法,采样统计的时候,InnoDB默认会选择N个数据页,统计这些页面上的不同值,得到一个平均值,然后乘以这个索引的页面数,就得到了这个索引的基数。
      我们数据是一直在变的,所以索引的统计信息也是会变的,会根据一个阈值,重新做统计。
      至于MySQL索引可能走错也很好理解,如果走A索引要扫描100行,B所有只要20行,但是他可能选择走A索引,你可能会想MySQL是不是有病啊,其实不是的。
      一般走错都是因为优化器在选择的时候发现,走A索引没有额外的代价,比如走B索引并不能直接拿到我们的值,还需要回到主键索引才可以拿到,多了一次回表的过程,这个也是会被优化器考虑进去的。
      他发现走A索引不需要回表,没有额外的开销,所有他选错了。
      如果是上面的统计信息错了,那简单,我们用analyze table tablename 就可以重新统计索引信息了,所以在实践中,如果你发现explain的结果预估的rows值跟实际情况差距比较大,可以采用这个方法来处理。
      还有一个方法就是force index强制走正确的索引,或者优化SQL,最后实在不行,可以新建索引,或者删掉错误的索引。
    • 覆盖索引
      如果在我们建立的索引上就已经有我们需要的字段,就不需要回表了,在电商里面也是很常见的,我们需要去商品表通过各种信息查询到商品id,id一般都是主键,可能sql类似这样:
    select itemId from itemCenter where size between 1 and 6
    

    在这里插入图片描述
    因为商品id itemId一般都是主键,在size索引上肯定会有我们这个值,这个时候就不需要回主键表去查询id信息了。
    由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。

    • 联合索引
      还是商品表举例,我们需要根据他的名称,去查他的库存,假设这是一个很高频的查询请求,你会怎么建立索引呢?
      大家可以思考上面的回表的消耗对SQL进行优化。
      是的建立一个,名称和库存的联合索引,这样名称查出来就可以看到库存了,不需要查出id之后去回表再查询库存了,联合索引在我们开发过程中也是常见的,但是并不是可以一直建立的,大家要思考索引占据的空间。
      在这里插入图片描述
      刚才我举的例子其实有点生硬,正常通过商品名称去查询库存的请求是不多的,但是也不代表没有哈,真来了,难道我们去全表扫描?
    • 最左匹配原则
      大家在写sql的时候,最好能利用到现有的SQL最大化利用,像上面的场景,如果利用一个模糊查询 itemname like ’敖丙%‘,这样还是能利用到这个索引的,而且如果有这样的联合索引,大家也没必要去新建一个商品名称单独的索引了。
      很多时候我们索引可能没建对,那你调整一下顺序,可能就可以优化到整个SQL了。
    • 索引下推
      你已经知道了前缀索引规则,那我就说一个官方帮我们优化的东西,索引下推。
    select * from itemcenter where name like '敖%' and size=22 and age = 20;
    

    所以这个语句在搜索索引树的时候,只能用 “敖”,找到第一个满足条件的记录ID1,当然,这还不错,总比全表扫描要好。
    然后呢?
    当然是判断其他条件是否满足,比如size。
    在MySQL 5.6之前,只能从ID1开始一个个回表,到主键索引上找出数据行,再对比字段值。
    在这里插入图片描述
    而MySQL 5.6 引入的索引下推优化(index condition pushdown), 可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。
    在这里插入图片描述

    • 唯一索引普通索引选择难题
      这个在我的面试视频里面其实问了好几次了,核心是需要回答到change buffer,那change buffer又是个什么东西呢?
      当需要更新一个数据页时,如果数据页在内存中就直接更新,而如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下,InooDB会将这些更新操作缓存在change buffer中,这样就不需要从磁盘中读入这个数据页了。
      在下次查询需要访问这个数据页的时候,将数据页读入内存,然后执行change buffer中与这个页有关的操作,通过这种方式就能保证这个数据逻辑的正确性。
      需要说明的是,虽然名字叫作change buffer,实际上它是可以持久化的数据。也就是说,change buffer在内存中有拷贝,也会被写入到磁盘上。
      将change buffer中的操作应用到原数据页,得到最新结果的过程称为merge。
      除了访问这个数据页会触发merge外,系统有后台线程会定期merge。在数据库正常关闭(shutdown)的过程中,也会执行merge操作。
      在这里插入图片描述
      显然,如果能够将更新操作先记录在change buffer,减少读磁盘,语句的执行速度会得到明显的提升。而且,数据读入内存是需要占用buffer pool的,所以这种方式还能够避免占用内存,提高内存利用率
      那么,什么条件下可以使用change buffer呢?
      对于唯一索引来说,所有的更新操作都要先判断这个操作是否违反唯一性约束。
      要判断表中是否存在这个数据,而这必须要将数据页读入内存才能判断,如果都已经读入到内存了,那直接更新内存会更快,就没必要使用change buffer了。
      因此,唯一索引的更新就不能使用change buffer,实际上也只有普通索引可以使用。
      change buffer用的是buffer pool里的内存,因此不能无限增大,change buffer的大小,可以通过参数innodb_change_buffer_max_size来动态设置,这个参数设置为50的时候,表示change buffer的大小最多只能占用buffer pool的50%。
      将数据从磁盘读入内存涉及随机IO的访问,是数据库里面成本最高的操作之一,change buffer因为减少了随机磁盘访问,所以对更新性能的提升是会很明显的。
      change buffer的使用场景
      因为merge的时候是真正进行数据更新的时刻,而change buffer的主要目的就是将记录的变更动作缓存下来,所以在一个数据页做merge之前,change buffer记录的变更越多(也就是这个页面上要更新的次数越多),收益就越大。
      因此,对于写多读少的业务来说,页面在写完以后马上被访问到的概率比较小,此时change buffer的使用效果最好,这种业务模型常见的就是账单类、日志类的系统。
      反过来,假设一个业务的更新模式是写入之后马上会做查询,那么即使满足了条件,将更新先记录在change buffer,但之后由于马上要访问这个数据页,会立即触发merge过程。这样随机访问IO的次数不会减少,反而增加了change buffer的维护代价,所以,对于这种业务模式来说,change buffer反而起到了副作用。
    • 前缀索引
      我们存在邮箱作为用户名的情况,每个人的邮箱都是不一样的,那我们是不是可以在邮箱上建立索引,但是邮箱这么长,我们怎么去建立索引呢?
      MySQL是支持前缀索引的,也就是说,你可以定义字符串的一部分作为索引。默认地,如果你创建索引的语句不指定前缀长度,那么索引就会包含整个字符串。
      我们是否可以建立一个区分度很高的前缀索引,达到优化和节约空间的目的呢?
      使用前缀索引,定义好长度,就可以做到既节省空间,又不用额外增加太多的查询成本。
      上面说过覆盖索引了,覆盖索引是不需要回表的,但是前缀索引,即使你的联合索引已经包涵了相关信息,他还是会回表,因为他不确定你到底是不是一个完整的信息,就算你是www.aobing@mogu.com一个完整的邮箱去查询,他还是不知道你是否是完整的,所以他需要回表去判断一下。
      下面这个也是我在阿里面试面试官问过我的,很长的字段,想做索引我们怎么去优化他呢?
      因为存在一个磁盘占用的问题,索引选取的越长,占用的磁盘空间就越大,相同的数据页能放下的索引值就越少,搜索的效率也就会越低。
      我当时就回答了一个hash,把字段hash为另外一个字段存起来,每次校验hash就好了,hash的索引也不大。
      我们都知道只要区分度过高,都可以,那我们可以采用倒序,或者删减字符串这样的情况去建立我们自己的区分度,不过大家需要注意的是,调用函数也是一次开销哟,这点当时没注意。
      就比如本来是www.aobing@qq,com 其实前面的www.基本上是没任何区分度的,所有人的邮箱都是这么开头的,你一搜一大堆出来,放在索引还浪费内存,你可以substring()函数截取掉前面的,然后建立索引。
      我们所有人的身份证都是区域开头的,同区域的人很多,那怎么做良好的区分呢?REVERSE()函数翻转一下,区分度可能就高了。
      这些操作都用到了函数,我就说一下函数的坑。
    • 条件字段函数操作
      日常开发过程中,大家经常对很多字段进行函数操作,如果对日期字段操作,浮点字符操作等等,大家需要注意的是,如果对字段做了函数计算,就用不上索引了,这是MySQL的规定。
      对索引字段做函数操作,可能会破坏索引值的有序性,因此优化器就决定放弃走树搜索功能。
      需要注意的是,优化器并不是要放弃使用这个索引。
      这个时候大家可以用一些取巧的方法,比如 select * from tradelog where id + 1 = 10000 就走不上索引,select * from tradelog where id = 9999就可以。
      隐式类型转换
      select * from t where id = 1
      如果id是字符类型的,1是数字类型的,你用explain会发现走了全表扫描,根本用不上索引,为啥呢?
      因为MySQL底层会对你的比较进行转换,相当于加了 CAST( id AS signed int) 这样的一个函数,上面说过函数会导致走不上索引。
    • 隐式字符编码转换
      还是一样的问题,如果两个表的字符集不一样,一个是utf8mb4,一个是utf8,因为utf8mb4是utf8的超集,所以一旦两个字符比较,就会转换为utf8mb4再比较。
      转换的过程相当于加了CONVERT(id USING utf8mb4)函数,那又回到上面的问题了,用到函数就用不上索引了。
      还有大家一会可能会遇到mysql突然卡顿的情况,那可能是MySQLflush了。
    • flush
      redo log大家都知道,也就是我们对数据库操作的日志,他是在内存中的,每次操作一旦写了redo log就会立马返回结果,但是这个redo log总会找个时间去更新到磁盘,这个操作就是flush。
      在更新之前,当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。
      内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页“。
      那什么时候会flush呢?
      InnoDB的redo log写满了,这时候系统会停止所有更新操作,把checkpoint往前推进,redo log留出空间可以继续写。
      系统内存不足,当需要新的内存页,而内存不够用的时候,就要淘汰一些数据页,空出内存给别的数据页使用。如果淘汰的是“脏页”,就要先将脏页写到磁盘。
      你一定会说,这时候难道不能直接把内存淘汰掉,下次需要请求的时候,从磁盘读入数据页,然后拿redo log出来应用不就行了?
      这里其实是从性能考虑的,如果刷脏页一定会写盘,就保证了每个数据页有两种状态:
      一种是内存里存在,内存里就肯定是正确的结果,直接返回;
      另一种是内存里没有数据,就可以肯定数据文件上是正确的结果,读入内存后返回。这样的效率最高。
      MySQL认为系统“空闲”的时候,只要有机会就刷一点“脏页”。
      MySQL正常关闭,这时候,MySQL会把内存的脏页都flush到磁盘上,这样下次MySQL启动的时候,就可以直接从磁盘上读数据,启动速度会很快。
      在这里插入图片描述
      那我们怎么做才能把握flush的时机呢?
      Innodb刷脏页控制策略,我们每个电脑主机的io能力是不一样的,你要正确地告诉InnoDB所在主机的IO能力,这样InnoDB才能知道需要全力刷脏页的时候,可以刷多快。
      这就要用到innodb_io_capacity这个参数了,它会告诉InnoDB你的磁盘能力,这个值建议设置成磁盘的IOPS,磁盘的IOPS可以通过fio这个工具来测试。
      正确地设置innodb_io_capacity参数,可以有效的解决这个问题。
      这中间有个有意思的点,刷脏页的时候,旁边如果也是脏页,会一起刷掉的,并且如果周围还有脏页,这个连带责任制会一直蔓延,这种情况其实在机械硬盘时代比较好,一次IO就解决了所有问题,
      在这里插入图片描述
      但是现在都是固态硬盘了,innodb_flush_neighbors=0这个参数可以不产生连带制,在MySQL 8.0中,innodb_flush_neighbors参数的默认值已经是0了。
      资料参考:《MySQL实战》、《高性能MySQL》、《丁奇MySQL47讲》

    在这里插入图片描述

    展开全文
  • 本文对 如何调优数据库 进行了方法总结 本文主要对于Mysql进行调优 Mysql的性能优化数据库的工作原理实现逻辑优化分析实现优化sql语句的优化使用缓存数据库设计添加索引进行分表 数据库的工作原理 首先要想调优...
  • 数据库调优

    2020-06-22 23:06:18
    其实关于数据库调优的知识点非常分散。不同的 DBMS,不同的公司,不同的职位,不同的项目遇到的问题都不尽相同。为了能让你对数据库调优有一个整体的概览,我把这些知识点做了一个梳理,希望能对你有一些帮助。 ...
  • 了解数据库调优

    2019-06-14 17:31:48
    MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化? a. 设计良好的数据库结构,允许部分数据冗余,尽量避免join查询,提高效率。 b. 选择合适的表字段数据类型和存储引擎,适当的添加...
  • 数据库调优】屡试不爽的面试连环combo

    万次阅读 多人点赞 2020-06-11 10:08:39
    前言 面试官:敖丙你简历上写了你会数据库调优,你都是怎么调优的? 敖丙:加索引。 面试官:还有么? 敖丙:没了。 面试官:我们公司的门你知道在哪里吧,自己走还是我送你? 哈哈开头这个场景是我臆想的一个面试...
  • oracle数据库调优方案

    2016-10-18 22:45:51
    Oracle数据库服务器是整个系统的核心,它的性能高低直接影响整个系统的性能,为了调整Oracle数据库服务器的性能,主要从以下几个方面考虑  ◆1、调整操作系统以适合Oracle数据库服务器运行 Oracle数据库服务器...
  • mysql数据库调优示例

    千次阅读 2020-11-26 20:34:02
    数据库调优
  • 文章目录一、数据库调优的目标二、确定调优目标的方式1. 用户的反馈2. 日志分析3. 服务器资源使用资源4. 数据库内部状况监控三、数据库的调优维度1. 选择合适的DBMS2. 优化表设计3. 优化逻辑查询4. 优化物理查询5. ...
  • 达梦数据库SQL调优

    2021-02-25 14:09:43
    2.达梦数据库的 INI 配置文件中各项参数是否已经处于最优配置; 3.应用系统中数据库设计是否合理。 二、目标 SQL 调优的整体目标是使用最优的执行计划,这意味着 IO 以及 CPU 代价最小。具体而言调优主要关注...
  • Oracle 数据库调优

    2019-03-11 11:16:14
    通常我们在安装完Oracle数据库以后本地就直接使用了,但是用在正式的生产环境上还是需要一点优化的,否则就会是默认的最低配机器配置。难以发挥服务器的性能。 这里记录一下比较常用的几个参数: 进入文件 /etc/...
  • 数据库调优,都有哪些纬度可以选择?数据库调优的目标第一步,选择适合的DBMS第二步,优化表设计第三步,优化逻辑查询第四步,优化物理查询第五步,使用 Redis 或 Memcached 作为缓存第六步,库级优化 数据库调优的...
  • mysql 数据库调优

    千次阅读 2011-09-15 12:32:40
    myql优化,启动mysql缓存机制,实现命中率100% ...配置你的mysql配置文件:主要是配置[mysqld]后面的内容。 1,优化远程连接速度。 在[mysqld]下面添加skip-name-resolve skip-name-resolve
  • 作者:andyao ... 转载请留名 1. 简介  在Web应用程序体系架构中,数据持久层(通常是一...MySQL是目前使用最多的开源数据库,但是MySQL数据库的默认设置性能非常的差,仅仅是一个玩具数据库。因此在产品中使用MySQL
  • Web应用性能提升之数据库调优Web应用性能提升之数据库调优Web应用性能提升之数据库调优
  • Mysql数据库调优——分区
  • 数据库调优 项目调优

    2020-07-04 07:57:10
    数据库调优 项目调优 Springboot项目调优 配置文件调优 更改Tomcat的相关配置 设置Tomcat的最大连接数 设置请求头最大内存 设置post请求的最大内存 设置Tomcat最大线程数 设置Tomcat的最小工作线程数 JVM调优 ...
  • 六、 MySQL数据库其他优化方法 ...整个数据库调优教程到此就该一段落了,算是把自己所学所用所得之经验都写进去了,如果同学们觉得有什么需要补充、有什么地方写的不好的,欢迎交流哈。
  • 内容包括: 第一章:oracle资源管理 第二章:oracle任务调度 第三章:AWR及顾问框架 ...由于文件过大,只提供百度网盘下载地址和提取码,请放心下载。 信誉第一,如有任何问题,可以给我发私信或者评论区留言
  • 一文教会你数据库性能调优(思路)

    千次阅读 2018-01-19 17:09:48
    看完这个图,你是不是对性能调优有了个基本的概念了.通常来讲我们会依照下面的顺序来进行分析: 硬件能力 系统规模 数据库内部因素 软件环境 这4个的顺序可以有所调整或者交换,但是对于系统的性能...
  • informix数据库调优

    千次阅读 2016-05-30 11:32:13
    调优思路整理如下一、PDQ即利用infomix提供的PDQ(并行数据库查询)功能,并结合Power8处理器的SMT特性来提高SQL查询效率 PDQ允许数据库服务器将查询一个方面的某个工作分发给几个处理器。例如:如果查询要求聚集,...
  • 数据库调优教程(三)记录慢查询

    千次阅读 2015-04-07 10:39:15
    在找到慢查询语句后,要通过反复使用select语句确认慢查询,注意只能使用select语句,就算是原来语句为delete或者update等,也要用select代替,因为只有select不会弄脏数据库 2) 另一种发现慢查询语句的...
  • MYSQL 应该是最流行了 WEB 后端数据库。WEB 开发语言最近发展很快,PHP, Ruby, Python, Java各有特点,虽然 NOSQL 最近越來越多的被提到,但是相信大部分架构师还是会选择 MYSQL 来做数据存储。 MYSQL 如此方便和...
  • 因此,数据库设计的知识还是比较广的,这篇文章主要是讲解一下主机调优。  我遇到过一些关于主机引起的数据库问题,比如数据库打开后,数据库的性能还可以,但是随着时间增长,主机的内存就会耗得很多,数据库就会...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 71,207
精华内容 28,482
关键字:

数据库调优数据库文件