4

最近我的网站出现问题,mysql 负载达到 800%,大多数查询都停留在“排序结果”集中。

问题是我做了一个测试。具有 1 个结果集的相同查询,排序需要 9.8 秒,没有排序需要 0.02 秒。查询包含 where 条件和 group by。

sql 已经过优化,搜索是在索引字段中进行的,直到几天前一切都很好。没有流量高峰,没有代码更改,什么都没有。

您过去是否遇到过这个问题,或者您知道我该如何解决?

谢谢

编辑:查询的解释:

           id: 1
  select_type: SIMPLE
        table: m
         type: range
possible_keys: posterid_to_idx,to,poster_id
          key: posterid_to_idx
      key_len: 8
          ref: NULL
         rows: 6
        Extra: Using where; Using filesort

同样,几天前同样的查询运行良好。

  `id` int(11) NOT NULL AUTO_INCREMENT,
  `body` longtext NOT NULL,
  `poster_id` int(11) NOT NULL,
  `poster_name` varchar(50) NOT NULL,
  `to` int(11) NOT NULL,
  `added` int(11) NOT NULL,
  `picture` varchar(64) NOT NULL,
  `folder` int(11) DEFAULT NULL,
  `read` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `posterid_to_idx` (`poster_id`,`to`),
  KEY `to` (`to`),
  KEY `poster_id` (`poster_id`),
  KEY `msg` (`id`,`poster_id`,`to`),
  KEY `added` (`added`)
) ENGINE=InnoDB AUTO_INCREMENT=37548617 DEFAULT CHARSET=latin1

    SELECT SQL_CALC_FOUND_ROWS m.body, m.id,  m.poster_id, m.poster_name, m.to, m.added, m.picture, m.folder
FROM messages m
WHERE  ((m.poster_id = '1885585' OR m.poster_id = '1886341') 
      AND (m.to = '1886341' OR m.to = '1885585'))                 
ORDER BY m.id DESC                 LIMIT 0, 10

顶部输出:

CPU:  6.0% user,  0.0% nice, 38.8% system,  0.2% interrupt, 55.0% idle
Mem: 11G Active, 1400M Inact, 5451M Wired, 87M Cache, 4923M Buf, 29G Free
Swap: 8000M Total, 8000M Free
4

1 回答 1

1

因此,在对 my.cnf 进行大量试用后,我通过以下方式解决了该问题:

  1. 减少查询缓存值

  2. 减少键缓冲区值

  3. 减少 tmp 表值

  4. 禁用的性能架构

我刚刚测试了各种配置,并且知道全流量(大约 6k 人在线)我的 mysql 保持 50% 的负载,这非常糟糕。没有进行 sql 或修改,只是 innodb 调整。

不确定这是否是针对有相同问题的人的答案,但至少是我的答案。

我的.cnf

query_cache_limit=128M
query_cache_size=128M
query_cache_type=1
key_buffer_size=128M
tmp_table_size=64M
performance_schema=off
于 2013-07-18T19:47:13.397 回答