全网最全的SQL性能优化,助你不再迷茫,步入人生巅峰

前言

优化MySQL数据库是数据库管理员和数据库开发人员的必备技能。MySQL优化,一方面是找出系统的瓶颈,提高MySQL数据库整体的性能;另一方面需要合理的结构设计和参数调整,以提高用户操作响应的速度;同时还要尽可能节省系统资源,以便系统可以提供更大负荷的服务。

MySQL数据库优化是多方面的,原则是减少系统的瓶颈,减少资源的占用,增加系统的反应速度。

MySQL查询

在MySQL中可以使用SHOW STATUS语句查询一些MySQL数据库的性能参数,SHOW STATUS语句语法如下:

SHOW STATUS LIKE 'value';

其中,value是要查询的参数值,一些常用的性能参数如下:

  • Connections: 连接MySQL服务器的次数。
  • Uptime: MySQL 服务器的上线时间。
  • Slow_ queries: 慢查询的次数。
  • Com_ select: 查询操作的次数。
  • Com jinsert: 插入操作的次数。
  • Com, _update: 更新操作的次数。
  • Com_ delete: 删除操作的次数。

如果查询MySQL服务器的连接次数,可以执行如下语句:

SHOW STATUS LIKE IConnections' ;

如果查询MySQL服务器的慢查询次数,可以执行如下语句:

SHOW STATUS LIKE 'S1ow queries';

查询其他参数的方法和上述两个参数的查询方法相同慢查询次数参数可以结合慢查询日志,找出慢查询语句,然后针对慢查询语句进行表结构优化或者查询语句优化。

MySQL Query Optimizer 概述

MySQL中有一个专门负责优化SELECT语句的优化器模块,该优化器模块就是QueryOptimizer,它的主要功能是将客户端传递的查询语句,结合数据库系统收集的各种统计信息,为客户端的SQL进行查询优化,最终给出优化之后的查询语句。

当用户模块发送请求给MySQL命令解析器之后,MySQL 命令解析器会将用户查询语句发送给MySQL查询优化器(Query Optimizer), 然后对查询语句进行优化。例如常量转化,无效内容删除,常量计算等待等等。Query Opimizer 会分析出最优化数据检索的方式,也就是常说的执行计划。

MySQL Query Optimizer的所有工作都是基于Query Tree的。Query Tree是通过优化实现DBXP的经典数据结构和Tree构造器而生成的一- 个指导完成一个Query语句的请求所需要处理的工作步骤,通过Query Tree 可以清楚地了解到一个 Query完成所需要经历的步骤,每一步的数据来源,以及处理方式等信息。

MySQL Query Optimizer是在CBO (Cost Base Optimizer)的基础上增加了一一个 Heuristic Optimize (启发式优化)的功能,MySQL Query Optimizer 在优化一个查 询语句并选择出最优执行计划的时候增加了某些特定的规则。

SQL语句优化的基本思路

在进行SQL语句优化的时候,首先要做的是找到问题的所在,然后才能有针对性地解决问题。

首先从业务上理解客户的真正需求,除了通过很复杂的SQL查询外,是否有更为简洁的方法得到客户的需求,这是进行优化SQL之前优先要考虑的。另外,对SQL进行优化时需要注意,SQL查询返回的结果集是否太大,数据量太大对客户来讲意义不大,如果返回的结果集太大往往需要消耗额外的磁盘读写,除非客户真正需要这么多数据,否则可以调整查询条件,从而降低查询结果集的大小。

在分析如何优化SQL语句之前,需要了解优化查询语句的基本思路。通常,查询语句优化思路主要体现在以下几个方面:

1.优化更需要优化的查询

什么样的查询是更需要优化的查询呢?这个要从整个系统的影响来考虑,什么样的优化能给系统整体带来更大的收益,就更需要优化的查询。例如高并发低消耗的查询对整个系统的影响远比低并发高消耗的查询大。下 面通过一个例子来理解。

假设有一个查询每分钟执行10000次,每次需要30个读写操作,另外一个查询每分钟执行100次,每次需要3000个读写操作。从读写消耗方面分析,两个查询每分钟所消耗的读写操作总数是一样。如果优化第一个查询,从30个读写降低到25个读写,则每分钟总的读写操作为250000个。如果优化第二个查询,想达到第一一个优化效果,则需要降低500读写操作。

可见第一个优化方案比第二个优化方案容易的多。

另外,比较CPU方面的消耗,原理和上面的完全一样。 只要让第一个查询稍微节省一小块资源,就可以让整个系统节省出一大块资源,尤其是在排序、分组这些对CPU消耗比较多的操作中非常突出。

从对整个系统的影响来分析。:一个频繁执行的高并发查询的危险性比一一个低并 发的查询要大很多。当一个低并发的查询走错执行计划,所带来的影响主要只是该查询的请求者的体验会变差,对整体系统的影响并不会特别的突出,至少还属于可控范围。如果-一个高并发的查询走错了执行计划,那所带来的后果很可能就是灾难性的。

2.定位优化对象的性能瓶颈

优化查询之前,首先要看该优化对象的性能瓶颈是读写问题还是CPU耗损问题,到底是数据运算方面耗费了太多资源,还是在数据访问上耗费了太多的时间等。

在MySQL 5.0系列版本中,可以通过系统自带的PROFILING功能很清楚地找出一个查询的瓶颈所在。而在早期的版本中,只能通过自行分析查询的各个操作步骤,找到性能耗损的瓶颈所在。

3.明确的优化目标

当找到优化的性能瓶颈之后,就需要制订明确的优化目标。首先需要搞清楚数据库目前的整体状态,这样才能知道数据库所能承受的最大压力。然后是清楚地知道数据库中与该查询相关的数据库对象的各种信息,这样才能知道该查询在最理想情况下需要消耗多少资源,最糟糕又需要消耗多少资源。最后是了解该查询在整个应用系统中所实现的功能,这样才能知道该查询所实现的功能点在整个应用系统中的重要地位,可以大概地分析出该查询可以占用的系统资源比例,也能够知道该查询的效率给客户带来的体验影响到底有多大。

明确了上述信息以后,就可以得出该查询应该满足的性能范围,这也就是优化目标范围,然后就是通过寻找相应的优化手段来解决问题了。如果该查询实现的应用系统功能比较重要,那么就需要进一步优化,可以在其他某些方面作出-些让步与牺牲,比如调整设计,调整索引组成等。

4.充分使用EXPLAIN和PROFILE工具对SQL语句进行分析

有了优化目标以后,就可以动手优化操作了。首先从Explain工具下手,通过此工具,可查看该查询的执行计划。在优化之前,必须要有一个预订的执行计划,然后借助Explain工具来验证调整后的结果是否满足预订的执行计划。对于不符合预期的执行计划需要不断分析查的写法和数据库对象的信息,继续调整尝试,直至得到预期的结果。在不断调整测试的过程中,如果发现MySQL Optimizer所选择的执行计划的实际执行效果确实比自己预设的要好,还是应该选择使用MySQL optimizer所生成的执行计划。

利用EXPLAIN分析查询语旬

通过对查询语句的分析,可以了解查询语句的执行情况,找出查询语句执行的瓶颈,从而优化查询语句。MySQL中提供了EXPLAIN语句,用来分析查询语句。

EXPLAIN语句的基本语法如下:

EXPLAIN [EXTENDED] SELECT select_ options

使用EXTENED关键字,EXPLAIN 语句将产生附加信息。select _options 是SELECT语句的查询选项,包括FROM WHERE子句等。

执行该语句,可以分析EXPLAIN后面的SELECT语句的执行情况,并且能够分析出所查询的表的一些特征。

利用Profiling分析查询语句

MySQL的Profiler 是一个使用非常方便的查询诊断分析工具,通过该工具可以获取一条查询在整个执行过程中多种资源的消耗情况,例如内存消耗、I0消耗和CPU消耗等。

Profile的语法规则如下:

SHOW PROFILE [type [,typel ...

[FOR QUERY n]

LIMIT row count [OFFSET offset]]

其中type参数的可选项含义如下:

  • ALL: 显示所有的信息。
  • BLOCKIO: 显示输入输出操作阻塞的数量。
  • CONTEXT SWITCHES:显示自动或非自动CONTEXT SWITCHES的数量。
  • CPU: 显示系统和用户CUP使用的时间。
  • IPC: 显示信息发送和接收的数量。
  • MEMORY: 内存的信息。
  • PAGE FAULTS:显示主要的PAGE FAULTS数量。
  • SOURCE: 显示函数的名称,并且显示函数所在文件的名字和行数。
  • SWAPS: 显示SWAP数量。

合理的使用索引进行优化

索引对查询速度的影响

MySQL中提高性能的一个最有效的方式就是对数据表设计合理的索引。索引提供了高效访问数据的方法,并且加快查询的速度,因此,索引对查询的速度有着至关重要的影响。使用索引可以快速地定位表中的某条记录,从而提高数据库查询的速度,提高数据库的性能。

如果查询时没有使用索引,查询语句将扫描表中的所有记录。在数据量大的情况下,这样查询的速度会很慢。如果使用索引进行查询,查询语句可以根据索引快速定位到待查询记录,从而减少查询的记录数,达到提高查询速度的目的。

如何使用索引查询

索引可以提高查询的速度。但并不是使用带有索引的字段查询时,索引都会起作用。

使用索引有几种特殊情况,在这些情况下,有可能使用带有索引的字段查询时,索引并没有起作用,下面重点介绍这几种特殊情况。

  • 1、使用LIKE关键字的查询语句

在使用LIKE关键字进行查询的查询语句中,如果匹配字符串的第一个字符为“%”,索引不会起作用。只有“%”不在第一个位置,索引才会起作用。

  • 2、使用多列索引的查询语句

MySQL可以为多个字段创建索引。一个索引可以包括16 个字段。对于多列索引,只有查询条件中使用了这些字段中第1个字段时,索引才会被使用。

  • 3.使用OR关键字的查询语句

查询语句的查询条件中只有OR关键字,且OR前后的两个条件中的列都是索引时,查询中才使用索引。否则,查询将不使用索引。

以上就是小编整理的SQL性能优化的简单介绍,只是小编自己的个人见解,如果有哪里整理的不准确,请大家多多批评指正,共同进步。

感觉小编整理的还不错的,请多多点赞评论转发,关注小编,你们的支持就是小编最大的动力!!!

猜你喜欢

转载自blog.csdn.net/python6_quanzhan/article/details/106624724