mysql - 我应该增加 MySQL 中的 sort_buffer_size 吗?

标签 mysql

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

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_buffer_size 参数,因为 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 上的索引,您应该进一步提高速度并减少内存使用量。

关于mysql - 我应该增加 MySQL 中的 sort_buffer_size 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29041809/

相关文章:

mysql - ORDER BY 和 DELETE 不起作用

mysql - SQL查询不返回表中的非唯一值

mysql - 几个名字的列表,用相同的信息更新他们在表中的行

php - 通过 ajax 请求调用时尝试插入数据时出现 500 内部服务器

php - 使用 laravel 使用 2 列按查询排序

php - 使用发布按钮更新表行值

mysql - 增加表中所有列的 varchar() 大小?

php - 更新另一个表上的特定表字段

mysql - JSON_EXTRACT 和方括号

mysql - 如何将所有现有应用程序数据从 sqlite3 复制到 Rails 中的 MySQL?