[英]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 by
和limit
。
使用 c.id 上的主索引和 g.citing 和 g.cited 上的索引,您应该进一步提高速度并减少内存使用量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.