我正在运行一个广泛查询 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 by
和 limit
。
有了 c.id 上的主索引和 g.citing 和 g.cited 上的索引,您应该进一步提高速度并减少内存使用量。
关于mysql - 我应该增加 MySQL 中的 sort_buffer_size 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29041809/