当前位置: 首页 > 网络应用技术

MySQL代码角度优化

时间:2023-03-07 02:49:23 网络应用技术

  微信技术小组:Day9884125

    1.此优化基于MySQL5.7数据库版本,这可能与其他版本指令不同。

    2.内部代码字符串中使用的单引号在Word中。将SQL代码直接放入程序中并运行。由于小米从他的Word文档中复制了它,并且该代码修改了太多位置。Xiaobian不进行手动处理,如果其他人可以根据原因进行修改

    在应用程序开发过程中,由于早期阶段的数据量较少,开发人员在编写SQL语句时更加关注功能实施。但是,当正式启动应用程序系统时,生产数量的急剧增加,许多SQL陈述逐渐暴露出绩效问题,并且对生产的影响也在增加。目前,这些问题SQL语句成为整个系统性能的性能。bottleNeck,因此我们必须优化它们。

    MySQL客户端连接已成功连接,服务器状态信息可以通过Show [Session |global] status command.show [session |global]状态可以添加参数会话或全局,以显示会话级别的统计结果(当前连接)和全局的统计结果(上次数据库)。如果您不编写默认参数,则是会话。

  代码指令

  COM_XXX表示每个XXX语句执行的次数。我们通常关心一些统计参数。

  COM_SELECT:执行SELCT操作的次数,一个查询仅累积1.仅添加1。

  COM_INSERT:执行插入操作的次数。对于插入的插入操作,仅一次。

  com_update:执行更新操作的次数

  com_delete:删除操作的次数

  com_rows_read:选择返回的行数。

  com_rows_inserted:插入插入操作中插入的行数。

  com_rows_updated:执行更新的行数。

  COM_ROWS_DELETE:删除操作删除的行数。

  连接:视图连接MySQL Server的次数。

  正常运行时间:服务器工作时间

  slow_queries:慢速查询数量

  COM_XXX:这些参数将累积所有存储引擎的表操作

  INNODB_XXX:这些参数仅用于InnoDB存储引擎,并且累积算法略有不同

  您可以在以下两种方法中找到具有较低效率的SQL语句。

    l慢查询日志:哪个具有较低执行效率的SQL语句通过慢速查询日志记录,使用--- log-slow-slow-queries [= file_name] option.mysqld编写一个日志文件,其中包含超过SQL语句的所有执行时间超过long_query_time秒。

    l show processList:查询结果后记录慢查询日志,因此在应用程序反应执行效率时查询查询日志中的日志。线程的状态,锁定手表等是否可以实时查看SQL的执行,同时优化了一些锁定仪的操作。

  ID列:当用户在MySQL中登录时,系统分配的Connection_ID可以使用function connection_id()来查看

  用户列:显示当前用户,如果不是root,则此命令仅显示用户权限范围的SQL语句

  主机列:显示从哪个IP发送的端口,该端口可用于跟踪出现问题语句的用户。

  列DB:当前连接是哪个数据库?

  命令列:显示当前连接的执行命令。通常,该值休眠,查询(查询),连接(连接),等。

  时间列:显示此持续时间,该单元是第二

  状态列:显示当前连接的SQL语句的状态。这是非常重要的。状态在执行语句,SQL语句和查询中描述了某个状态。它可能需要将复制传递给TMP表格,然后对结果进行排序

  发送数据和其他状态可以完成

  信息列:显示此SQL语句是判断问题陈述的重要基础。

  查询表结构指令:

    在以上步骤查询以低效率查询SQL语句后,您可以获取如何通过dixper或desc命令执行选择语句的信息,包括如何在选择语句执行期间连接和连接表的顺序。

  检查SQL语句的执行计划:

  注意:使用上述SQL语句时,请先输入某个数据库,并说明为:使用FIRE;

  ID:选择查询的序列号是一组数字,这意味着在查询中执行了SELCT句子或操作表的顺序。

  select_type:指示选择的类型。共同值很简单(简单的表,即没有表连接或子查询),主(主查询,外部查询),联合(联合第二或后面的后背后是Quely语句),子查询(儿童查询中的第一个选择), ETC。

  表:输出结果表

  类型:表的连接类型,从好连接到差连接的性能类型为(System-Const-EQ_REF-REF_OR_NULL-INDEX_MERGE-INDEX_SUBQ_SUBQURY-RANGE-INDEX-ALL)

  可能的_keys:索引查询期间可能使用的索引

  钥匙:索引意味着实际使用

  key_len:索引字段的长度

  行:扫描线的数量

  额外:执行情况的解释和描述

  创建三张表

  创建表't_user'('id'varchar(32)不是null,'username'varchar(45)不是null,'password'varrawar(96)not null,'name'name'varchar(45)不是null(主键“ action”,)引擎= innodb默认charset = utf8;

    ID字段是选择查询的序列号,这是一组数字,这意味着在查询中执行选择句子或操作表。ID条件有三种类型:

  1)加载表的顺序与从上到下相同。

  2)ID的ID值越大,优先级越高,首先执行的ID值越多。

  指示select的类型,公共值的类型,如下表所示:select_type含义:简单:简单选择查询,查询不包括sub -query或union在查询中

  主:如果查询包含任何复杂的子查询,则最外面的查询标签是徽标

  子查询:在选择或列表中包括次要

  派生:从列表中包含的子查询,标记为派生(导数)mysql递归这些子问题,将结果放在临时表中

  联盟:如果第二个选择出现在工会中,则标记为工会;如果将联合包含在子阶段的子问题中,则外部选择将被标记为派生

  联合结果:从联合表中从上到下选择从上到下的结果

    显示有关哪个表的数据

    类型显示访问类型,这是一个更重要的指标。值可以是:

  类型含义:

  null:MySQL无法访问任何表,索引并直接返回结果

  系统:只有一行记录(等于系统表)。这是const类型的特殊情况。一般来说

  const:这意味着可以通过索引找到一次,并且const用于比较主键或umipue索引。由于仅将主要键放入WHERE列表中,因此仅匹配一系列数据行,MySQL,则可以将查询转换为常数。const将主索引的所有部分与常数值进行比较。

  eq_ref:类似于参考,区别在于使用唯一的索引。使用主密钥查询只有一个关联查询的记录。常用于主索引扫描或唯一的索引扫描。

  参考:非唯一性索引扫描,返回到匹配单个值的所有行。它也是索引访问,返回与单个值匹配的所有行(多个)。

  范围:仅检索给定的行,并使用索引选择一个选择行。<,>在和其他操作中。

  索引:索引和所有内容之间的区别在于,索引类型仅遍历索引树,通常比所有索引树都更快,所有这些都在遍历数据文件。

  全部:完整的表将遍历以找到匹配线

  从上到下的效率越来越低

  可能的_keys:显示可能应用于此表的索引,一个或多个。

  钥匙:使用的实际索引,如果是空的,则没有索引

  key_len:这是指索引中使用的字节数。此值是索引字段的最大长度。这不是实际使用时间长度。在没有失去损失的前提下,长度越短,越好。

  扫描数

  &emsp;&emsp;此列中显示了其他其他执行技术信息。

  额外的含义:

  使用FileSort:这意味着MySQL将在数据中使用外部索引排序,而不是在表中的索引序列中读取。称为文件排序

  使用tempory:使用临时表保存中间结果。分类查询结果时,MySQL通常按顺序按顺序进行排序,并通过

  使用索引:这意味着相应的选择操作使用覆盖索引避免访问表的数据行,并且效率很好。

  如果目前使用Filesort和使用临时性,则必须考虑优化SQL语句

  &emsp;&emsp;MySQL添加了对显示配置文件的支持,并来自版本5.0.37的显示配置文件语句。Show配置文件可以帮助我们知道执行SQL优化时花费的时间。

  通过have_profiling参数,您可以查看当前的MySQL是否支持配置文件:

  以下描述支持

  使用的说明是:select @@ have_profiling;

  &emsp;&emsp;查看是否打开priling:以下内容是0表示未打开。

  指示:选择@@ propiling;

  设置分析= 1;//打开分析开关;

  通过个人资料,我们可以更清楚地了解SQL的过程。

  首先,我们可以执行一系列操作,如下图所示:

  &emsp;&emsp;执行上述命令后,然后执行SHOW配置文件指令以查看SQL语句执行的时间消耗:

  指令:显示个人资料

  &emsp;&emsp;通过查询QUERY_ID的SHOW配置文件。

  &emsp;&emsp;在获得最多的时间 - 令人费解的线程状态后,MySQL支持更多详细信息,例如ALL,Block IO,上下文开关,页面故障和其他详细类型。例如,选择查看CPU的消耗时间:

  &emsp;&emsp;MySQL5.6提供了SQL的跟踪轨迹。通过跟踪文件,您可以进一步了解为什么优化器选择A计划,而不是选择B程序。

  &emsp;&emsp;打开跟踪,将格式设置为JSON,并设置可用于避免在解析过程中完全显示的最大内存大小,因为默认存储器太小。

  执行SQL语句:

  最后,检查inoverle_schema.optimizer_trace以了解MySQL如何执行SQL:

  &emsp;&emsp;索引是数据库优化的最常用和最重要的方法之一。该索引通常可以帮助用户解决大多数MySQL的性能优化问题。

  在我们准备的表结构TB_Item中,总共存储了300万个记录;根据ID查询查询

  &emsp;&emsp;查询速度很快,将近0秒,主要原因是因为ID是主要键,有索引,查询不超过300万个索引数据的数据的5秒;检查索引计划需要0.01秒,为标题字段创建索引:

  大约一分钟,创建索引需要很长时间。

  1)全值匹配,在索引中指定所有列的特定值。在这种情况下,索引有效,执行效率很高。

  2)左前言定律(在复合指数中观察到的规则)

  &emsp;&emsp;如果索引多个列,则必须遵守左侧前缀规则。它是指从索引左侧开始的查询,并且不会跳过索引中的列。

  3)请勿检查索引列

  4)不要在索引列上执行操作操作,索引将失败。

  5)字符串不会添加一个引号,导致索引损失

  *6)尝试使用封面索引避免选择;**

  &emsp;&emsp;尝试使用封面索引(仅访问索引的查询(索引列完全包含查询列表))来减少选择

  1)使用分割的条件。如果以前条件中的列有索引,并且后续列不是索引,则不会使用所涉及的索引。例如:名称字段是索引列,而cerxeTime则不是索引列。

  2)就像从%开始的模糊查询一样,索引失败。如果尾巴模糊,索引不会失败。如果头部模糊,则索引将失败。

  解决模糊查询的问题导致索引失败:可以通过覆盖ID来解决,即查询结果都是索引列。一旦查询不是索引列,索引将失败。

  其中,SellerId是主要钥匙,因此SellerId具有索引,名称,状态,地址是索引列

  密码不是索引列。目前,SQL索引将失败

  3)如果MySQL评估比全表扫描慢,则不会使用该索引。

  特定列的数据结果在数据库中有很大比例,并且索引将被放弃。

  4)无效,有时不会索引。

  它与数据库中的数据量有关。如果null帐户的大多数数据库都不是null。

  5)在索引中,不在索引失败中

  6)单列索引和综合索引尽可能多地使用复合索引,并使用较少的单列索引。创建复合索引:

  创建一个单列索引:

  数据库将选择使用它的最佳索引(最高识别索引),并且不会使用所有索引。

  删除索引操作说明:

  检查表中的哪些索引说明:

  Handler_read_first:索引中读取的次数较高,这意味着服务器正在执行大量的完整索引扫描(值越低,越好)。

  handler_ream_key:如果索引正在工作,则此值表示索引值读取的次数。如果值较低,则意味着索引的性能不高,因为索引不经常使用(值越高,越好)。

  Handler_read_next:根据密钥顺序阅读下一行中的请求数。如果您使用范围约束或执行索引扫描来查询索引列,则值会增加。

  handler_ream_prev:读取密钥顺序之前的请求数,此方法主要用于优化订单。

  handler_read_rnd:根据固定位置读取行请求数。如果您执行大量查询并且需要对结果进行排序,则值更高。您可能会使用很多mysql扫描整个表查询或您的连接不使用正确的使用密钥。此高价值意味着操作效率较低,并且应建立索引补救措施。

  Handler_read_rnd_next:读取数据文件中下一行中的请求数。如果您扫描大量表,则此值很高。通常显示您的手表索引不正确或不使用索引的书面查询。

  环境准备:

  当使用加载和命令导入数据时,适当的设置可以提高导入的效率。

  对于InnoDB型表,有几种方法可以提高进口效率:

  1)插入主键的顺序,因为InnoDB类型表是按主键的顺序存储的,因此根据主键的顺序排列导入数据的介绍,这可以有效提高导入的效率数据。如果InnoDB表没有主键,则系统将自动创建一个内部列作为主键,因此,如果您可以为表格创建主键,则可以使用它来提高导入的效率数据。

  脚本文件简介:sql1.loog ----------->主要密钥顺序sql2.log ------------->主要键是无序的

  1)插入ID订单安排数据:

  导入数据指令:

  2)关闭唯一验证:

  在导入数据之前,执行SET sele_checks = 0,关闭唯一的性验证,并在引言后执行setute setute setute_checks = 1,并恢复唯一的验证以提高进口效率。

  3)交易的手动提交

  &emsp;&emsp;如果应用程序使用自动提交方法,建议在导入之前执行设置自动通信= 0,请关闭自动提交,然后在介绍后执行set autocommit = 1。打开自动提交也可以提高进口效率。

  &emsp;&emsp;执行数据的数据操作时,可以考虑以下优化方案。

  &emsp;&emsp;如果您需要同时在表上插入大量数据,则应尝试尽可能多地使用多个值表的插入语句。此方法将大大减少客户端和数据库的连接和关闭。制作单独执行的单个插入语句。

  例如,原始方法是:

  优化计划是:

  交易中的数据插入:

  订单数据插入:

  优化:

  &emsp;&emsp;1)首先是对返回数据进行排序,该数据通常称为Filesort排序。所有排序结果的所有分类均未通过索引来称为Filesort排序。

  指令代码:从tuniD desc中从EMP订单中选择;

  查看性能代码:DESC从EMP订单中解释选择;

  &emsp;&emsp;第二种类型的订单通过有序索引订单直接返回到订单数据。这种情况正在使用索引。它不需要其他分类,并且运行效率很高。

  注意:查询结果和排序条件必须是索引,否则必须是以下结果。这次,duthid不是索引列,empid是主要键,因此它是索引列

  说明代码:通过tunId desc从EMP订单中选择EMPID;

  查看绩效代码:解释由tunId desc中的EMP订单中的选择EMPID;

  注意:查询结果中的一个不是索引列。即使排序条件是索引列,也不会使用索引。

  目前,duthid是一个索引列,empid是主要键,因此是索引列,empname不是索引列

  多场分类

  所有订单,或所有订单都可以同时拥有订单和订单

  目前,duthid和age empid均为索引

  对应

  &emsp;&emsp;在理解MySQL的排序方法之后,优化目标是明确的:最小化附加分类,并直接通过索引返回顺序数据。条件使用与顺序相同的索引,而订单的顺序与索引顺序,订单字段都在上升或下降。否则,必须需要额外的操作,以便filesort出现

  &emsp;&emsp;通过创建合适的索引,可以减少Filesort的出现,但是在某些情况下,条件限制不会消失,然后需要加速Filesort的排序操作。对于Filesort,MySQL具有两个分类算法。

  &emsp;&emsp;1)两种扫描算法:在MySQL4.1之前,先对此方法进行排序。首先根据条件取出分类字段和行毒信息,然后在排序区域中的排序缓冲区中排序。如果排序缓冲区还不够,它将将排序结果存储在临时表效率表中。完成排序后,根据指针返回表读取记录,该操作可能会导致大量随机的I/O操作。

  &emsp;&emsp;2)扫描算法:取出一次符合条件的所有字段,然后在排序区域中的排序缓冲区进行排序后输出结果设置。处理排序,内存开销很大,但是排序效率为高于两种扫描算法。

  &emsp;&emsp;MySQL通过比较系统变量max_length_for_sort_data大小和从查询语句中获取的字段的总大小以确定哪种排序算法合适。如果max_length_for_sort_data较大,则在第二个优化后使用第一个算法;否则第一种类型。

  &emsp;&emsp;您可以适当地增加max_length_for_sort_data和sort_buffer_size系统变量,以增加排序区域的大小并提高排序效率。

  查看max_length_for_sort_data和sort_buffer_size变量

  &emsp;&emsp;由于小组通过实际执行排序操作,并与订单相比,组主要是分类后的组操作。,索引可以像顺序一样使用。

  &emsp;&emsp;如果查询包含组,但用户希望避免消耗排序结果,则禁止按NULL的顺序排序,如下:

  优化:

  进一步优化之后:需要为年龄列建立索引

  &emsp;&emsp;MySQL4.1版本,开始支持SQL子Query。该技术可以使用SELECT语句创建一个单个查询结果,然后将此结果用作另一个查询中的过滤条件。使用Sub -Query可以完成SQL操作,该SQL操作需要多个步骤才能一次完成许多步骤。同时,它还可以避免交易或表锁,并且很容易编写。但是,在某些caseshigh -效率连接替换中。

  示例:查找字符的所有用户信息:

  优化后,它是:

  &emsp;&emsp;用于包含或。如果要使用索引,则每个条件列之间或之间或不使用索引;如果没有索引,则应考虑添加索引。

  在EMP表中获取所有索引:

  有时您可以使用工会代替或

  优化代码:

  优化代码:

  让我们比较重要的指标,并发现主要区别是类型和参考

  类型显示访问类型,这是一个更重要的指标。从好到坏的结果值是:

  系统> const> eq_ref> ref> fullText> ref_or_null> index_merge> unipue_subquery> index_subquery> range> range> index> index>

  联合语句的类型值是参考,OR语句的类型值是范围。可以看出,这是一个非常明显的差距。

  联合语句的参考值为const,或说明的值为null,const表示常数参考,非常快速

  这两个项目之间的差距表明联合比OR更好。

  &emsp;&emsp;在寻求调查时,它可以通过创建覆盖索引来提高性能。一个常见且头痛的问题是限制20000,10在MySQL排序之前的2000010记录,仅返回2000000-2000010的记录。其他记录被丢弃,查询排序的成本非常大。

  &emsp;&emsp;在索引上完成分类分页操作,最后返回到原始表查询所需的其他列。

  &emsp;&emsp;该方案适用于主键的自我信息表,主键不能有故障。您可以将限制查询转换为特定位置的查询。

  &emsp;&emsp;SQL提示是优化数据库的重要手段。简而言之,一些人工提示被添加到SQL语句中,以实现优化操作的目的。

  &emsp;&emsp;在查询语句的名称之后,添加使用索引以提供希望参考mySQL的索引列表,以便mySQL不能考虑其他可用索引。没有强制性的是建议

  使用前:

  优化:

  如果用户只是希望MySQL忽略一个或多个索引,则可以在使用之前使用忽略索引:

  优化:

  为了强制MySQL使用特定索引,您可以在查询中使用力索引

  使用前:

  优化:

  原始:https://juejin.cn/post/709832263673932831