最近我的网站出现问题,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