sql自学规划:慢查询 MySQL 定位优化技巧,从10s优化到300ms

 网络   2022-09-26 13:00   32

文章纲录何如定位并优化急盘问sql?何如利用急盘问日志?急盘问例子演示,新脚都能瞅懂盘问语句急怎么办?explain带您综合sql履行意图当主键索引、仅有索引、特殊索引都生存,盘问优化器何如选拔?1.何如定位并优化急盘问SQL?

1般有3个推敲目标 1.依据急日志定位急盘问sql 2.利用explain等器材综合sql履行意图 3.更正sql或者者尽快让sql走索引

2.何如利用急盘问日志?

先给没步调,后背解说

有3个步调

1.合封急盘问日志

起首合封急盘问日志,由参数slow_Query_log决计是不是合封,在mysql饬令止下输进上面的饬令:

set global slow_query_log=on;

默认环境下,急盘问日志是闭闭的,所以这面合封。

2.配置急盘问阈值 set global long_query_time=1;

唯有您的SQL实践履行空儿逾越了这个阈值,就会被忘录到急盘问日志面里。这个阈值默认是10s,线上交易1般恳求把long_query_time配置为1s,即使某个交易的MySQL要求比较下的QPS,可配置急盘问为0.1s。

创造急盘问即时优化或者者提醒开辟改写。1般测试环境恳求long_query_time配置的阀值比临盆环境的小,比如临盆环境是1s,则测试环境恳求设置成0.5s。便于在测试环境即时创造1些效力的SQL。

以至某些急迫交易测试环境long_query_time不妨配置为0,以便忘录一起语句。并介意急盘问日志的输没,上线前的罪能测试完竣后,综合急盘问日志每类语句的输没,重面存眷Rows_examined(语句履行期间从存储引擎读与的止数),提前优化。

3.断定急盘问日志的文件名和途径 show global variables like 'slow_query_log_file'

终归会创造急日志默认途径便是MySQL的data纲录,我们不妨来瞅1下MySQLdata纲录

show global variables like 'datadir';

不必存眷这面为什么不是MySQL 8.0,这和版原没什么联络的。

来,直接上菜,搞巴巴的定义我本人都瞅不上来

我们先来审查1下变质,我框没了必要留意的面

盘问带有quer的关系变质

show global variables like '%quer%';

这面配置急盘问阈值为1s

set global long_query_time=1;

不妨瞅到未经更正过来了

可是重封mysql客户端配置和统计急盘问日志条数就会清零,即一起设置更正会恢复

饬令更正设置以后,在饬令止net stop mysql闭闭MySQL工作,再net start mysql合封MySQL工作,接着履行show global variables like '%quer%';会创造设置恢复了。

在设置文件更正才干永久转变,可则重封data库就恢复了

3.急盘问例子演示,新脚都能瞅懂

data表构造,躲懒没写comment

CREATE TABLE `person_info_large` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `account` VARCHAR (10), `name` VARCHAR (20), `area` VARCHAR (20), `title` VARCHAR (20), `motto` VARCHAR (50), PRIMARY KEY (`id`), UNIQUE(`account`), KEY `index_area_title`(`area`,`title`) ) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8

这面的data是200W条。请留意表构造,记着哪几个字段有索引便可,后续围绕这个表停止综合。

sql自学规划:慢查询 MySQL 定位优化技巧,从10s优化到300ms

这个3.36s并不是实践履行空儿,实践履行空儿失往急盘问日志往瞅Query_time参数

不妨瞅到Query_time: 6.337729s,逾越了1s,所以会被忘录,1个select语句盘问这样久,的确无法容忍。

图中其他的参数解说如下:

Time:急盘问发作的空儿Query_time:盘问空儿Lock_time:期待锁表的空儿Rows_sent:语句返归的止数Rows_exanined:语句履行期间从存储引擎读与的止数

上里这类体例是用零碎自带的急盘问日志审查的,即使以为零碎自带的急盘问日志不圆便审查,不妨利用pt-query-digest或者者mysqldumpslow等器材对于急盘问日志停止综合。

留意:有的急盘问正在履行,终归未经致使data库背载过下,而由于急盘问还没履行完,所以急盘问日志瞅不到任何语句,此时不妨利用show processlist饬令审查正在履行的急盘问。show processlist再现哪些线程正在运止,即使有PROCESS权限,则不妨瞅到一起线程。可则,只能瞅到现在会话线程。4.盘问语句急怎么办?explain带您综合sql履行意图

依据上1节的表构造不妨结识,account是添加了仅有索引的字段。explain综合1下履行意图。

我们重面必要存眷select_type、type、possible_keys、key、Extra这些列,我们来11解说,瞅到select_type列,这面是SIMPLE单纯盘问,其他值上面给年夜家列没。

type列,这面是index,透露表现全索引扫描

表格从上到下代表了sql盘问功能从最优到最好,即使是type范例是all,解说sql语句必要优化。

留意:即使type = NULL,则标明个MySQL不必查询表或者者索引,直接就可以获得终归,比如explain select sum(1+2);

possible_keys代表能够用到的索引列,key透露表现实践用到的索引列,以实践用到的索引列为准,这是盘问优化器优化当时选拔的,尔后我们也不妨依据实践环境弱制利用我们本人的索引列来盘问。

Extra列,这面是Using index

1定要留意,Extra中消失Using filesort、Using temporary代表MySQL底子不能利用索引,效力会遭到重要作用,应该尽能够的往优化。

消失Using filesort解说MySQL对于终归利用1个外部索引排序,而不是从表面按索引程序读到关系体例,有索引就保护了B+树,data原来就未经排差序了,这解说底子没有用到索引,而是data读完以后再排序,能够在内存或者者磁盘上排序。也有人将MySQL中无法诈骗索引的排序职掌称为“文件排序”。

消失Using temporary透露表现MySQL在对于盘问终归排序时利用长期表,常见于order by和分组盘问group by

归到上1个话题,我们瞅到account是添加了仅有索引的字段。explain综合了履行意图后

直接遵守account落序来查

审查急盘问日志创造,利用索引以后,盘问200W条data的速度快了2s

接着我们综合1下盘问name的sql履行意图

尔后给name字段加上索引

加上索引以后,连续瞅瞅盘问name的sql履行意图

相比1下前里name不加索引时的履行意图就会创造,加了索引后,type由ALL全表扫描变成index索引扫描。order by并无 using filesort,而是using index,这面B+树未经将这个非纠集索引的索引字段的值排差序了,而不是比及盘问的时间再往排序。

接着我们连续履行盘问语句,此时name未经是添加了索引的。

终归创造,name添加索引以前,落序盘问name是耗费6.337729s,添加索引以后,落序盘问name耗费了3.479827s,道理便是B+树的终归集未经是有序的了。

5.当主键索引、仅有索引、特殊索引都生存,盘问优化器何如选拔?

盘问1下data的条数,这面count(id),综合1下sql履行意图

这面实践利用的索引是account仅有索引。

综合1下:实践利用哪个索引是盘问优化器决计的,B+树的叶子结面便是链表构造,遍历链表就能统计数目,可是这弛表,有主键索引、仅有索引、特殊索引,优化器选拔了account这个仅有索引,这确定不会利用主键索引,因为主键索引是纠集索引,每个叶子包罗具体的1个止忘录(许多列的data都在面里),而非纠集索引每个叶子只包罗下1个主键索引的指针,很隐然叶子结面包罗的data是越少越差,盘问优化器就不会选拔主键索引

固然,也不妨弱制利用主键索引,尔后综合sql履行意图

我们瞅1下优化器默认利用仅有索引疏忽履行空儿676ms

弱制利用主键索引疏忽履行空儿779ms

我们不妨用force index弱制指定索引,尔后往综合履行意图瞅瞅哪个索引是更差的,因为盘问优化器选拔索引不1定是百分百明确的,具体环境不妨依据实践场景综合来断定是不是利用盘问优化器选拔的索引。

本文地址:http://yz.ziyouea.com/p/4520.html
版权声明:本站文章来自网络,如有违规侵权请联系我们下架。