如何优化MySQL:索引、慢速查询、配置

  • A+
所属分类:MySQL

MySQL仍然是世界上最流行的关系数据库,然而,它仍然是最未优化的--许多人把它放在默认值上,不需要进一步研究。在这篇文章中,我们将研究我们前面讨论过的一些MySQL优化技巧,并将它们与自那以后出现的新奇之处结合起来。

配置优化

第一个(也是大多数跳过的!)性能升级--MySQL的每个用户都应该做的--就是调整配置。5.7(当前版本)的默认设置要比以前的版本好得多,但在这些基础上进行改进仍然很容易。

我们假设您使用的是基于linux的主机或流浪汉像我们这样的盒子宅基地改进所以您的配置文件将在

1
/etc/mysql/my.cnf

...您的安装可能实际将一个辅助配置文件加载到该配置文件中,因此请查看--如果

1
my.cnf

文件内容不多,文件

1
/etc/mysql/mysql.conf.d/mysqld.cnf

可能。

编辑配置

您需要习惯于使用命令行。即使你还没有接触过它,现在也是最好的时机。

如果在VagrantBox上进行本地编辑,则可以将文件复制到主文件系统中,方法是将文件复制到共享文件夹中。

1
cp /etc/mysql/my.cnf /home/vagrant/Code

并使用常规文本编辑器进行编辑,然后在完成后将其复制回原处。否则,通过执行

1
sudo vim /etc/mysql/my.cnf

.

注意:修改上面的路径以匹配配置文件的实际位置--它可能在

1
/etc/mysql/mysql.conf.d/mysqld.cnf

手动调整

下面的手动调整应该用盒子来完成。按这些提示,将其添加到

1
[mysqld]

部分:


1
2
3
4
innodb_buffer_pool_size = 1G # (adjust value here, 50%-70% of total RAM)
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 1 # may change to 2 or 0
innodb_flush_method = O_DIRECT
  • 1
    innodb_buffer_pool_size

    -缓冲池是一个存储区域,用于缓存内存中的数据和索引。它用于将频繁访问的数据保存在内存中,当您运行专用或虚拟服务器时,当DB经常成为瓶颈时,给应用程序的这一部分提供最多的RAM是有意义的。因此,我们给它50-70%的内存。中有一个缓冲池大小指南可供使用。MySQL文档.

  • 日志文件大小得到了很好的解释。这里但是简单地说,这是在删除日志之前要在日志中存储多少数据。请注意,在本例中,日志不是错误日志或可能用来使用的内容,而是指示检查点时间,因为对于MySQL,写入会在后台发生,但仍然会影响前景性能。大日志文件意味着更好的性能,因为创建了更少的新检查点和更小的检查点,但在崩溃时恢复时间更长(需要向DB重写更多内容)。
  • 1
    innodb_flush_log_at_trx_commit

    说明这里并指示日志文件发生了什么。对于1,我们有最安全的设置,因为日志在每个事务之后都被刷新到磁盘。对于0或2,这是较少的酸,但更多的性能。在这种情况下,差别不足以超过设置1的稳定性好处。

  • 1
    innodb_flush_method

    -最重要的是冲水,这个设置为

    1
    O_DIRECT

    以避免双重缓冲。除非I/O系统的性能很低,否则应该始终这样做。在大多数托管服务器上,如Digital大洋液滴,您将拥有SSD,因此I/O系统将是高性能的。

Percona的另一个工具可以帮助我们自动找到剩下的问题。请注意,如果我们在没有上述手动调整的情况下运行它,那么只会手动识别4个修复程序中的一个,因为其他3个取决于用户偏好和应用程序的环境。

如何优化MySQL:索引、慢速查询、配置插图

可变检验员

若要在Ubuntu上安装变量检查器,请执行以下操作:


1
2
3
4
<span class="token function">wget</span> https://repo.percona.com/apt/percona-release_0.1-4.<span class="token variable">$(lsb_release -sc)</span>_all.deb
<span class="token function">sudo</span> dpkg -i percona-release_0.1-4.<span class="token variable">$(lsb_release -sc)</span>_all.deb
<span class="token function">sudo</span> <span class="token function">apt-get</span> update
<span class="token function">sudo</span> <span class="token function">apt-get</span> <span class="token function">install</span> percona-toolkit

对于其他系统,请遵循指令.

然后,使用以下工具运行该工具箱:


1
pt-variable-advisor h<span class="token operator">=</span>localhost,u<span class="token operator">=</span>homestead,p<span class="token operator">=</span>secret

您应该看到与此类似的输出:


1
2
3
4
5
6
7
8
9
<span class="token comment"># WARN delay_key_write: MyISAM index blocks are never flushed until necessary.</span>

<span class="token comment"># NOTE max_binlog_size: The max_binlog_size is smaller than the default of 1GB.</span>

<span class="token comment"># NOTE sort_buffer_size-1: The sort_buffer_size variable should generally be left at its default unless an expert determines it is necessary to change it.</span>

<span class="token comment"># NOTE innodb_data_file_path: Auto-extending InnoDB files can consume a lot of disk space that is very difficult to reclaim later.</span>

<span class="token comment"># WARN log_bin: Binary logging is disabled, so point-in-time recovery and replication are not possible.</span>

这些都不是关键,它们不需要被修复。我们可以添加的唯一方法是为复制和快照目的进行二进制日志记录。

注意:在新版本中,binlog大小默认为1G,PT不会注意到。


1
2
3
4
max_binlog_size = 1G
log_bin = /var/log/mysql/mysql-bin.log
server-id=master-01
binlog-format = 'ROW'
  • 这个
    1
    max_binlog_size

    设置确定二进制日志的大小。这些日志记录事务和查询并设置检查点。如果事务大于max,则日志在保存到磁盘时可能大于max-否则MySQL将使其保持在此限制。

  • 这个
    1
    log_bin

    选项完全启用二进制日志记录。没有它,就没有快照或复制。请注意,这在磁盘空间上是非常艰苦的。当激活二进制日志时,服务器ID是一个必要的选项,因此日志知道它们来自哪个服务器(用于复制),并且日志的格式只是写日志的方式。

正如您所看到的,新的MySQL具有正常的默认设置,使产品几乎可以生产。当然,每个应用程序是不同的,并有更多的自定义调整适用。

MySQL调谐器

这个调谐器将以更长的间隔监视数据库(在实时应用程序上每周运行一次),并根据日志中看到的内容提出更改建议。

只需下载即可安装:


1
2
<span class="token function">wget</span> https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl
<span class="token function">chmod</span> +x mysqltuner.pl

1
./mysqltuner.pl

将询问您的管理用户名和数据库密码,并输出信息从快速扫描。例如,以下是我的InnoDB部分:


1
2
3
4
5
6
7
8
9
10
11
<span class="token punctuation">[</span>--<span class="token punctuation">]</span> InnoDB is enabled.
<span class="token punctuation">[</span>--<span class="token punctuation">]</span> InnoDB Thread Concurrency: 0
<span class="token punctuation">[</span>OK<span class="token punctuation">]</span> InnoDB File per table is activated
<span class="token punctuation">[</span>OK<span class="token punctuation">]</span> InnoDB buffer pool / data size: 1.0G/11.2M
<span class="token punctuation">[</span><span class="token operator">!</span><span class="token operator">!</span><span class="token punctuation">]</span> Ratio InnoDB log <span class="token function">file</span> size / InnoDB Buffer pool size <span class="token punctuation">(</span>50 %<span class="token punctuation">)</span>: 256.0M * 2/1.0G should be equal 25%
<span class="token punctuation">[</span><span class="token operator">!</span><span class="token operator">!</span><span class="token punctuation">]</span> InnoDB buffer pool <span class="token operator">&lt;=</span> 1G and Innodb_buffer_pool_instances<span class="token punctuation">(</span><span class="token operator">!=</span>1<span class="token punctuation">)</span>.
<span class="token punctuation">[</span>--<span class="token punctuation">]</span> Number of InnoDB Buffer Pool Chunk <span class="token keyword">:</span> 8 <span class="token keyword">for</span> 8 Buffer Pool Instance<span class="token punctuation">(</span>s<span class="token punctuation">)</span>
<span class="token punctuation">[</span>OK<span class="token punctuation">]</span> Innodb_buffer_pool_size aligned with Innodb_buffer_pool_chunk_size <span class="token operator">&amp;</span> Innodb_buffer_pool_instances
<span class="token punctuation">[</span>OK<span class="token punctuation">]</span> InnoDB Read buffer efficiency: 96.65% <span class="token punctuation">(</span>19146 hits/ 19809 total<span class="token punctuation">)</span>
<span class="token punctuation">[</span><span class="token operator">!</span><span class="token operator">!</span><span class="token punctuation">]</span> InnoDB Write Log efficiency: 83.88% <span class="token punctuation">(</span>640 hits/ 763 total<span class="token punctuation">)</span>
<span class="token punctuation">[</span>OK<span class="token punctuation">]</span> InnoDB log waits: 0.00% <span class="token punctuation">(</span>0 waits / 123 writes<span class="token punctuation">)</span>

同样,需要注意的是,随着服务器一直在运行,这个工具应该每周运行一次。一旦一个配置值被更改并且服务器重新启动,那么从那时起,它应该运行一个星期。这是一个好主意,设置一个cronJobs为您这样做,并定期发送您的结果。


确保在每次配置更改后重新启动MySQL服务器:


1
<span class="token function">sudo</span> <span class="token function">service</span> mysql restart

指标

接下来,让我们关注索引-许多爱好者DB管理员的主要痛苦点!尤其是那些立即跳入ORM并因此从未真正暴露在原始SQL中的人。

注意:关键字和索引可以互换使用。

您可以在一本书中将MySQL索引与索引进行比较,这样您就可以轻松地找到包含您要寻找的主题的正确页面。如果没有任何索引,您将不得不浏览整本书,寻找包含主题的页面。

正如您可以想象的那样,通过索引搜索比浏览每一页要快得多。因此,向数据库添加索引通常会加快选择查询的速度。但是,索引也必须创建和存储。因此,更新和插入查询将更慢,并将花费更多的磁盘空间。通常,如果索引正确,您不会注意到更新和插入表的不同之处,因此建议在正确的位置添加索引。

只包含几行的表实际上并不能从索引中获益。您可以想象,搜索5页并不比先查找索引、获取页码然后打开该特定页面要慢得多。

那么,我们如何找出要添加哪些索引,以及存在哪些类型的索引?

唯一/主要指标

主索引是数据的主要索引,是数据寻址的默认方式。对于用户帐户,可能是用户ID,或者用户名,甚至是主电子邮件。主要索引是唯一的。唯一索引是不能在一组数据中重复的索引。

例如,如果用户选择了一个特定的用户名,那么其他任何人都不应该能够使用它。将“唯一”索引添加到

1
username

列解决了这个问题。如果有人试图插入一个已经存在的用户名的行,MySQL会抱怨。


1
2
3
4
<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>
<span class="token keyword">ALTER</span> <span class="token keyword">TABLE</span> <span class="token punctuation">`</span>users<span class="token punctuation">`</span>
<span class="token keyword">ADD</span> <span class="token keyword">UNIQUE</span> <span class="token keyword">INDEX</span> <span class="token punctuation">`</span>username<span class="token punctuation">`</span> <span class="token punctuation">(</span><span class="token punctuation">`</span>username<span class="token punctuation">`</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>

主键/索引通常是在创建表时定义的,唯一的索引是在事实之后通过更改表来定义的。

主键和唯一键都可以同时在单个列或多个列上生成。例如,如果希望确保每个国家只能定义一个用户名,则可以对这两列进行唯一索引,如下所示:


1
2
3
4
<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>
<span class="token keyword">ALTER</span> <span class="token keyword">TABLE</span> <span class="token punctuation">`</span>users<span class="token punctuation">`</span>
<span class="token keyword">ADD</span> <span class="token keyword">UNIQUE</span> <span class="token keyword">INDEX</span> <span class="token punctuation">`</span>usercountry<span class="token punctuation">`</span> <span class="token punctuation">(</span><span class="token punctuation">`</span>username<span class="token punctuation">`</span><span class="token punctuation">,</span> <span class="token punctuation">`</span>country<span class="token punctuation">`</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>

唯一的索引被放置到列中,您将经常处理这些列。因此,如果用户帐户经常被请求,而且数据库中有许多用户帐户,那么这是一个很好的用例。

正则指数

常规索引便于查找。当您需要通过特定的列或列的组合快速找到数据时,它们非常有用,但是这些数据不需要是唯一的。


1
2
3
4
<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>
<span class="token keyword">ALTER</span> <span class="token keyword">TABLE</span> <span class="token punctuation">`</span>users<span class="token punctuation">`</span>
<span class="token keyword">ADD</span> <span class="token keyword">INDEX</span> <span class="token punctuation">`</span>usercountry<span class="token punctuation">`</span> <span class="token punctuation">(</span><span class="token punctuation">`</span>username<span class="token punctuation">`</span><span class="token punctuation">,</span> <span class="token punctuation">`</span>country<span class="token punctuation">`</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>

以上所述将使搜索每个国家的用户名更快。

索引还有助于排序和分组速度。

全文索引

全文索引用于全文搜索.只有InnoDB和MyISAM存储引擎支持全文索引,并且只支持CHAR、VARCHAR和Text列。

这些索引对于您可能需要执行的所有文本搜索都非常有用。在正文中寻找词是全文的特点。如果您经常允许在应用程序中搜索这些内容,请在帖子、评论、描述、评论等上使用这些内容。

降阶指数

不是一种特殊的类型,而是一种改变。在版本8+中,MySQL支持下降指数,这意味着它可以按降序存储索引。如果您有大量的表,这些表通常首先需要最后添加的数据,或者以这种方式排列条目的优先级,这就会派上用场。按降序排序总是可能的,但是性能损失很小。这进一步加速了事态的发展。


1
2
3
4
5
6
7
<span class="token keyword">CREATE</span> <span class="token keyword">TABLE</span> t <span class="token punctuation">(</span>
  c1 <span class="token keyword">INT</span><span class="token punctuation">,</span> c2 <span class="token keyword">INT</span><span class="token punctuation">,</span>
  <span class="token keyword">INDEX</span> idx1 <span class="token punctuation">(</span>c1 <span class="token keyword">ASC</span><span class="token punctuation">,</span> c2 <span class="token keyword">ASC</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
  <span class="token keyword">INDEX</span> idx2 <span class="token punctuation">(</span>c1 <span class="token keyword">ASC</span><span class="token punctuation">,</span> c2 <span class="token keyword">DESC</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
  <span class="token keyword">INDEX</span> idx3 <span class="token punctuation">(</span>c1 <span class="token keyword">DESC</span><span class="token punctuation">,</span> c2 <span class="token keyword">ASC</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
  <span class="token keyword">INDEX</span> idx4 <span class="token punctuation">(</span>c1 <span class="token keyword">DESC</span><span class="token punctuation">,</span> c2 <span class="token keyword">DESC</span><span class="token punctuation">)</span>
<span class="token punctuation">)</span><span class="token punctuation">;</span>

在处理数据库中写入的日志、最后加载的帖子和注释以及类似的日志时,请考虑将DESC应用于索引。

辅助工具:解释

在优化查询时,解释工具将是无价之宝。在简单查询前加上

1
EXPLAIN

将以非常深入的方式处理它,分析在使用中的指标,并向您显示命中率和失误率。您将注意到它需要处理多少行才能得到您正在寻找的结果。


1
2
3
<span class="token keyword">EXPLAIN</span> <span class="token keyword">SELECT</span> City<span class="token punctuation">.</span>Name <span class="token keyword">FROM</span> City
<span class="token keyword">JOIN</span> Country <span class="token keyword">ON</span> <span class="token punctuation">(</span>City<span class="token punctuation">.</span>CountryCode <span class="token operator">=</span> Country<span class="token punctuation">.</span>Code<span class="token punctuation">)</span>
<span class="token keyword">WHERE</span> City<span class="token punctuation">.</span>CountryCode <span class="token operator">=</span> <span class="token string">'IND'</span> <span class="token operator">AND</span> Country<span class="token punctuation">.</span>Continent <span class="token operator">=</span> <span class="token string">'Asia'</span>

您可以通过以下方式进一步扩展

1
EXTENDED

:


1
2
3
<span class="token keyword">EXPLAIN</span> <span class="token keyword">SELECT</span> City<span class="token punctuation">.</span>Name <span class="token keyword">FROM</span> City
<span class="token keyword">JOIN</span> Country <span class="token keyword">ON</span> <span class="token punctuation">(</span>City<span class="token punctuation">.</span>CountryCode <span class="token operator">=</span> Country<span class="token punctuation">.</span>Code<span class="token punctuation">)</span>
<span class="token keyword">WHERE</span> City<span class="token punctuation">.</span>CountryCode <span class="token operator">=</span> <span class="token string">'IND'</span> <span class="token operator">AND</span> Country<span class="token punctuation">.</span>Continent <span class="token operator">=</span> <span class="token string">'Asia'</span>

看看如何使用这个方法,并通过阅读来应用这些发现。这个极好的,详细的职位.

辅助工具:用于重复索引的Percona

之前安装的PerconaToolkit还提供了一个检测重复索引的工具,在使用第三方CMS或只是检查意外添加的索引是否超过需要时,该工具可以派上用场。例如,默认WordPress安装在

1
wp_posts

表:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
pt-duplicate-key-checker h<span class="token operator">=</span>localhost,u<span class="token operator">=</span>homestead,p<span class="token operator">=</span>secret

<span class="token comment"># ########################################################################</span>
<span class="token comment"># homestead.wp_posts</span>
<span class="token comment"># ########################################################################</span>

<span class="token comment"># Key type_status_date ends with a prefix of the clustered index</span>
<span class="token comment"># Key definitions:</span>
<span class="token comment">#   KEY `type_status_date` (`post_type`,`post_status`,`post_date`,`ID`),</span>
<span class="token comment">#   PRIMARY KEY (`ID`),</span>
<span class="token comment"># Column types:</span>
<span class="token comment">#      `post_type` varchar(20) collate utf8mb4_unicode_520_ci not null default 'post'</span>
<span class="token comment">#      `post_status` varchar(20) collate utf8mb4_unicode_520_ci not null default 'publish'</span>
<span class="token comment">#      `post_date` datetime not null default '0000-00-00 00:00:00'</span>
<span class="token comment">#      `id` bigint(20) unsigned not null auto_increment</span>
<span class="token comment"># To shorten this duplicate clustered index, execute:</span>
ALTER TABLE <span class="token variable">`homestead`</span><span class="token keyword">.</span><span class="token variable">`wp_posts`</span> DROP INDEX <span class="token variable">`type_status_date`</span>, ADD INDEX <span class="token variable">`type_status_date`</span> <span class="token punctuation">(</span><span class="token variable">`post_type`</span>,<span class="token variable">`post_status`</span>,<span class="token variable">`post_date`</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

从最后一行中可以看到,它还向您提供了如何消除重复索引的建议。

辅助工具:用于未使用索引的Percona

Percona还可以检测未使用的索引。如果您正在记录慢速查询(请参阅下面的瓶颈部分),您可以运行该工具,它将检查这些日志查询是否使用与查询相关的表中的索引。


1
pt-index-usage /var/log/mysql/mysql-slow.log

有关此工具的详细使用,请参见这里.

瓶颈

本节将解释如何检测和监视数据库中的瓶颈。


1
2
3
slow_query_log  = /var/log/mysql/mysql-slow.log
long_query_time = 1
log-queries-not-using-indexes = 1

应将上述内容添加到配置中。它将监视超过1秒的查询,以及那些不使用索引的查询。

一旦这个日志有了一些数据,您就可以用上面提到的方法来分析它的索引使用情况。

1
pt-index-usage

工具,或

1
pt-query-digest

产生如下结果的工具:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
pt-query-digest /var/log/mysql/mysql-slow.log

<span class="token comment"># 360ms user time, 20ms system time, 24.66M rss, 92.02M vsz</span>
<span class="token comment"># Current date: Thu Feb 13 22:39:29 2014</span>
<span class="token comment"># Hostname: *</span>
<span class="token comment"># Files: mysql-slow.log</span>
<span class="token comment"># Overall: 8 total, 6 unique, 1.14 QPS, 0.00x concurrency ________________</span>
<span class="token comment"># Time range: 2014-02-13 22:23:52 to 22:23:59</span>
<span class="token comment"># Attribute          total     min     max     avg     95%  stddev  median</span>
<span class="token comment"># ============     ======= ======= ======= ======= ======= ======= =======</span>
<span class="token comment"># Exec time            3ms   267us   406us   343us   403us    39us   348us</span>
<span class="token comment"># Lock time          827us    88us   125us   103us   119us    12us    98us</span>
<span class="token comment"># Rows sent             36       1      15    4.50   14.52    4.18    3.89</span>
<span class="token comment"># Rows examine          87       4      30   10.88   28.75    7.37    7.70</span>
<span class="token comment"># Query size         2.15k     153     296  245.11  284.79   48.90  258.32</span>
<span class="token comment"># ==== ================== ============= ===== ====== ===== ===============</span>
<span class="token comment"># Profile</span>
<span class="token comment"># Rank Query ID           Response time Calls R/Call V/M   Item</span>
<span class="token comment"># ==== ================== ============= ===== ====== ===== ===============</span>
<span class="token comment">#    1 0x728E539F7617C14D  0.0011 41.0%     3 0.0004  0.00 SELECT blog_article</span>
<span class="token comment">#    2 0x1290EEE0B201F3FF  0.0003 12.8%     1 0.0003  0.00 SELECT portfolio_item</span>
<span class="token comment">#    3 0x31DE4535BDBFA465  0.0003 12.6%     1 0.0003  0.00 SELECT portfolio_item</span>
<span class="token comment">#    4 0xF14E15D0F47A5742  0.0003 12.1%     1 0.0003  0.00 SELECT portfolio_category</span>
<span class="token comment">#    5 0x8F848005A09C9588  0.0003 11.8%     1 0.0003  0.00 SELECT blog_category</span>
<span class="token comment">#    6 0x55F49C753CA2ED64  0.0003  9.7%     1 0.0003  0.00 SELECT blog_article</span>
<span class="token comment"># ==== ================== ============= ===== ====== ===== ===============</span>
<span class="token comment"># Query 1: 0 QPS, 0x concurrency, ID 0x728E539F7617C14D at byte 736 ______</span>
<span class="token comment"># Scores: V/M = 0.00</span>
<span class="token comment"># Time range: all events occurred at 2014-02-13 22:23:52</span>
<span class="token comment"># Attribute    pct   total     min     max     avg     95%  stddev  median</span>
<span class="token comment"># ============ === ======= ======= ======= ======= ======= ======= =======</span>
<span class="token comment"># Count         37       3</span>
<span class="token comment"># Exec time     40     1ms   352us   406us   375us   403us    22us   366us</span>
<span class="token comment"># Lock time     42   351us   103us   125us   117us   119us     9us   119us</span>
<span class="token comment"># Rows sent     25       9       1       4       3    3.89    1.37    3.89</span>
<span class="token comment"># Rows examine  24      21       5       8       7    7.70    1.29    7.70</span>
<span class="token comment"># Query size    47   1.02k     261     262  261.25  258.32       0  258.32</span>
<span class="token comment"># String:</span>
<span class="token comment"># Hosts        localhost</span>
<span class="token comment"># Users        *</span>
<span class="token comment"># Query_time distribution</span>
<span class="token comment">#   1us</span>
<span class="token comment">#  10us</span>
<span class="token comment"># 100us  ################################################################</span>
<span class="token comment">#   1ms</span>
<span class="token comment">#  10ms</span>
<span class="token comment"># 100ms</span>
<span class="token comment">#    1s</span>
<span class="token comment">#  10s+</span>
<span class="token comment"># Tables</span>
<span class="token comment">#    SHOW TABLE STATUS LIKE 'blog_article'\G</span>
<span class="token comment">#    SHOW CREATE TABLE `blog_article`\G</span>
<span class="token comment"># EXPLAIN /*!50100 PARTITIONS*/</span>
SELECT b0_.id AS id0, b0_.slug AS slug1, b0_.title AS title2, b0_.excerpt AS excerpt3, b0_.external_link AS external_link4, b0_.description AS description5, b0_.created AS created6, b0_.updated AS updated7 FROM blog_article b0_ ORDER BY b0_.created DESC LIMIT 10

如果您希望手工分析这些日志,也可以这样做--但首先需要将日志导出为更“可分析”的格式。这可以通过以下方式来完成:


1
mysqldumpslow /var/log/mysql/mysql-slow.log

附加的参数可以进一步过滤数据,并确保只导出重要的内容。例如:按平均执行时间排序的前10个查询。


1
mysqldumpslow -t 10 -s at /var/log/mysql/localhost-slow.log
avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: