微信技术小组: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