繁体   English   中英

我应该在 MySQL 中增加 sort_buffer_size 吗?

[英]Should I increase sort_buffer_size in MySQL?

我正在运行一个广泛查询 MySQL 数据库的站点。 一些查询数据库服务器的页面加载速度非常慢,我很确定这是由于数据库服务器。 通过查看数据库服务器的使用情况,我可以看到 iowait 大于 10 秒,交换空间也被部分使用。 打开慢查询日志后,我发现一个查询一直很慢。 查询看起来像

select g.citing from g, c where g.cited=8992 and g.citing=c.id order by c.size desc limit 20;

典型的查询时间约为 10 秒。 innodb_buffer_pool_size 设置为 24GB。 我阅读了一些 MySQL 手册页,发现我可能需要调整Sort_merge_passes参数,因为Sort_merge_passes状态变量非常高(大约 310818)。 sort_buffer_size的当前值是 2M,我不确定我应该向上还是向下,因为有人说永远不要超过 2M。 当前查询没有利用索引。 “EXPLAIN”语句的结果给出以下结果:

+----+-------------+-----------+--------+---------------+---------+---------+--------------------------------+------+---------------------------------+
| id | select_type | table     | type   | possible_keys | key     | key_len | ref                            | rows | Extra                           |
+----+-------------+-----------+--------+---------------+---------+---------+--------------------------------+------+---------------------------------+
|  1 | SIMPLE      | g         | ref    | citing,cited  | cited   | 8       | const                          |  306 | Using temporary; Using filesort |
|  1 | SIMPLE      | c         | eq_ref | PRIMARY,id    | PRIMARY | 8       | db1.g.citing                    |    1 |                 |
+----+-------------+-----------+--------+---------------+---------+---------+--------------------------------+------+---------------------------------+

我试图考虑一个更好的查询,它可以利用索引,但现在没有运气。 谁能帮我吗? 我很感激。

简而言之,没有。

如果你能避免它,就不会。

在增加任何类型的内存分配之前,请尝试寻找替代解决方案。 通常这将是两件事之一(或两者):查询优化和索引。

在您的情况下,查询可以显着优化。 它目前正在做的是查询g每一行乘以c每一行,然后应用where子句,然后是order by ,然后是limit

如果您改用连接,则如下所示:

select g.citing from g
inner join c on g.citing=c.id
where g.cited=8992
order by c.size desc
limit 20;

这样做是查询g每一行,然后查询c每一行以查找匹配项,然后在两个表的交集上应用where子句 - 比以前少得多的行 - 后跟order bylimit

使用 c.id 上的主索引和 g.citing 和 g.cited 上的索引,您应该进一步提高速度并减少内存使用量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM